# 07.4.3.18.1 — Skeleton Architecture

## Цель этапа

Заложить базовую архитектуру слоя runtime-событий и Telegram-уведомлений без переноса существующей бизнес-логики уведомлений.

Главная задача этапа — подготовить ядро, чтобы в следующих шагах можно было переносить уведомления из `AutoTradeRunner`, `DebugTradeRunner`, `ExecutionEngine` и других runtime-компонентов без переписывания архитектуры.

## Что добавлено

### Runtime Events Layer

Создан новый слой:

```text
app/src/runtime_events/
    __init__.py
    event_types.py
    models.py
    publisher.py
```

Назначение слоя:

```text
runtime logic
    ↓
RuntimeEvent
    ↓
RuntimeEventPublisher
```

Этот слой отвечает за публикацию событий runtime-уровня, но не знает деталей Telegram, UI или конкретных шаблонов сообщений.

### Notification Layer

Создан новый слой:

```text
app/src/notifications/
    __init__.py
    models.py
    service.py
    targets.py
    dedupe.py
    templates/
        __init__.py
        signal.py
        execution.py
    channels/
        __init__.py
        telegram.py
```

Назначение слоя:

```text
RuntimeEvent
    ↓
NotificationService
    ↓
Notification template
    ↓
TelegramNotificationChannel
```

Этот слой отвечает за:
- выбор шаблона уведомления;
- дедупликацию уведомлений;
- отправку в Telegram;
- логирование результата доставки;
- централизованное хранение Telegram target.

## Добавленные runtime event types

Добавлен enum `RuntimeEventType`:

```text
AUTO_SIGNAL_READY
POSITION_OPENED
POSITION_CLOSED
POSITION_FLIPPED
EXECUTION_BLOCKED
RISK_ALERT
SYSTEM_ALERT
```

На этапе 07.4.3.18.1 эти события только описаны архитектурно. Массовый перенос runtime-логики на них будет сделан следующими подэтапами.

## Добавлена модель RuntimeEvent

Добавлена единая модель события:

```text
RuntimeEvent
    event_type
    source
    title
    payload
    priority
    dedupe_key
    created_at
```

Это будущий контракт между торговым runtime и системой уведомлений.

## Добавлена модель NotificationMessage

Добавлена единая модель готового уведомления:

```text
NotificationMessage
    title
    text
    priority
    parse_mode
    dedupe_key
```

Эта модель отделяет runtime-событие от конкретного Telegram-сообщения.

## Добавлен NotificationTargetRegistry

Создан in-memory registry для хранения активной Telegram-цели уведомлений:

```text
NotificationTargetRegistry
    set_bot()
    set_default_chat()
    get_bot()
    get_default_chat_id()
    is_ready()
```

Пока target хранится в памяти. В будущем его можно перенести в БД без изменения runtime-слоя.

## Интеграция с app bootstrap

В `app/src/bootstrap/app_factory.py` добавлена регистрация `Bot` в `NotificationTargetRegistry` сразу после создания Telegram Bot.

Это даёт notification layer доступ к bot instance без прямой зависимости от UI handler-ов.

## Интеграция с AUTO/DEBUG runner

В `AutoTradeRunner.register_screen()` и `DebugTradeRunner.register_screen()` добавлена регистрация текущего `chat_id` как default notification target.

Это позволяет будущим runtime-уведомлениям знать, куда отправлять сообщения.

## Что не менялось на этом этапе

На этом этапе намеренно не переносились:

- strong signal alerts;
- paper execution alerts;
- risk alerts;
- Telegram send_message из существующих runner-ов;
- cooldown-логика strong signal;
- execution alert dedupe.

Эти изменения будут выполняться поэтапно, чтобы не сломать текущую рабочую логику.

## Исправление circular import

После первичной интеграции был найден circular import:

```text
notifications.__init__
    → NotificationService
    → runtime_events
    → RuntimeEventPublisher
    → NotificationService
```

Исправление:

- из `runtime_events/__init__.py` убран экспорт `RuntimeEventPublisher`;
- из `notifications/__init__.py` убран экспорт `NotificationService`.

Теперь прямые импорты выполняются из конкретных модулей:

```python
from src.runtime_events.publisher import RuntimeEventPublisher
from src.notifications.service import NotificationService
```

## Проверка

Проверено:

```bash
python -m compileall src
python -m src.main
```

Ожидаемое поведение после этапа:

- бот запускается без ImportError;
- основные экраны открываются;
- текущая UI lifecycle логика не меняется;
- новых runtime Telegram-уведомлений пока не появляется;
- notification target регистрируется при открытии AUTO/DEBUG экранов.

## Итог

Этап 07.4.3.18.1 завершает подготовку архитектурного skeleton для будущего runtime notification pipeline.

Следующий этап:

```text
07.4.3.18.2 — Move strong signal alerts
```

На нём strong signal alerts будут перенесены из `AutoTradeRunner` в новый runtime event / notification слой.
