# Dzentra --- Instrument Reference Data Migration Plan

> Статус: Утверждённый базовый план миграции

## Общая стратегия

Миграция выполняется постепенно без нарушения работы существующего бота.

Основные принципы:

-   не переписывать подсистему целиком;
-   не удалять legacy-код до полного перевода потребителей;
-   сохранять публичные интерфейсы `ExchangeService`;
-   не создавать параллельную бизнес-логику без плана удаления;
-   разделять Acquisition, Validation, Storage и Processing;
-   выполнять миграцию небольшими проверяемыми Build.

------------------------------------------------------------------------

## План Build

    Build Цель                                                 Совместимость
  ------- ---------------------------------------------------- ------------------------
      001 Внутренняя модель Instrument Reference Data          Без изменения runtime
      002 Raw-модели ответа Dzengi                             Полная
      003 Структурная валидация exchangeInfo                   Полная
      004 Parser exchangeInfo                                  Полная
      005 Value validation                                     Полная
      006 Mapper Dzengi → Instrument                           Полная
      007 Protocol и Exceptions                                Полная
      008 Dzengi REST Adapter                                  Полная
      009 Instrument Handler                                   Полная
      010 Instrument Feed                                      Полная
      011 Registry                                             Полная
      012 Acquisition Service                                  Полная
      013 Проверка эквивалентности старой и новой реализации   Полная
      014 Compatibility mapper Instrument → ExchangeSymbol     Полная
      015 Переключение get_exchange_symbols()                  Полная
      016 Перевод normalize_symbol()/symbol_candidates()       Полная
      017 Переключение validate_symbol()                       Полная
      018 Переключение get_symbol_runtime_status()             Полная
      019 Подготовка переноса кэша в Storage                   Полная
      020 Перенос кэша                                         Полная
      021 Перевод первой группы потребителей                   Полная
      022 Перевод валидации и runtime-статусов на канонический Instrumen
      023 Перевод рыночных runtime-потребителей на канонический Instrument
      024 Удаление неиспользуемого legacy Market Handler
      025 Удаление ExchangeSymbol compatibility layer и завершение миграции

------------------------------------------------------------------------

## Зависимости

``` text
001
 ↓
002
 ↓
003
 ↓
004
 ↓
005
 ↓
006
 ↓
007
 ↓
008
 ↓
009
 ↓
010
 ↓
011
 ↓
012
 ↓
013
 ↓
014
 ↓
015
 ├──→016→017
 └──→018
        ↓
019→020
        ↓
021→022+
        ↓
023
 ↓
024
 ↓
025
```

------------------------------------------------------------------------

## Точки обратной совместимости

До завершения миграции должны сохраняться:

-   `ExchangeService.get_exchange_symbols()`
-   `ExchangeService.validate_symbol()`
-   `ExchangeService.get_symbol_runtime_status()`

Также сохраняются:

-   сигнатуры методов;
-   старые импорты;
-   формат ошибок;
-   Telegram UI;
-   автоторговля;
-   существующее поведение runtime;
-   совместимость `ExchangeSymbol` через временный compatibility mapper.

------------------------------------------------------------------------

## Классификация изменений

  Тип                                    Значение
  -------------------------------------- ----------------------------------
  Исправление ошибки                     Исправляет неверную работу
  Обязательное архитектурное изменение   Необходимо для новой архитектуры
  Улучшение надёжности                   Не меняет наблюдаемое поведение
  Изменение поведения                    Требует отдельного согласования

------------------------------------------------------------------------

## Улучшения допускаются

Допускается:

-   усиление типизации;
-   безопасная обработка неполных данных;
-   исправление ошибок parser;
-   корректная обработка filters;
-   улучшение надёжности REST;
-   отделение транспортной логики от предметной;
-   тестируемые контракты.

Недопустимо без согласования:

-   изменение поведения;
-   изменение TTL кэша;
-   изменение правил валидации;
-   изменение логики UI.

------------------------------------------------------------------------

## Build 001

### Цель

Создать независимую внутреннюю модель Instrument Reference Data.

На этом этапе:

-   не переносится parser;
-   не создаётся REST adapter;
-   не меняется ExchangeService;
-   не меняется runtime;
-   не переносится кэш.

### Для начала Build 001 необходимо получить

Обязательно:

1.  модель `ExchangeSymbol`;
2.  `SymbolValidationResult`;
3.  `normalize_symbol()`;
4.  `symbol_candidates()`;
5.  `validate_symbol()`;
6.  `integrations/exchange/service.py`;
7.  текущий parser `exchangeInfo`;
8.  текущий mapper (если существует);
9.  модели ответа `exchangeInfo`;
10. REST-клиент `exchangeInfo`;
11. обработку filters/status/marketModes.

Также нужны результаты `grep` по использованию этих сущностей и, если
существуют, соответствующие тесты.

------------------------------------------------------------------------

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

После каждого Build:

1.  анализ;
2.  внесение изменений только текущего этапа;
3.  обновление тестов;
4.  проверка импортов;
5.  проверка синтаксиса;
6.  запуск тестов;
7.  запуск приложения;
8.  проверка обратной совместимости.

Только после успешного завершения Build допускается переход к следующему
этапу.
