0002 — Состояние Instance это TPH; переход заменяет сущность
Контекст
Инстанция запуска/бэктеста проходит через состояния (pending → scheduled → starting → running → terminal). Мы моделируем состояние с EF Core Table-Per-Hierarchy (TPH): каждое состояние является подтипом (StartingRunInstance, RunningRunInstance, …). Колонна discriminator EF TPH не может меняться на существующей строке.
Решение
Переход состояния заменяет сущность новым экземпляром подтипа вместо мутирования поля статуса. Потому что строка заменяется, ID инстанции меняется через starting → running → terminal. ID контейнера стабилен и несется через переходы; HTTP узел агент ключится по ID контейнера для status/report/stop/logs.
Последствия
- Каждое состояние является отдельным типом только с полями и методами действительными в этом состоянии — незаконные переходы и бессмысленный доступ поля являются ошибками компилирования, не проверками во время выполнения.
- Вызывающие стороны не должны кешировать ID инстанции через переход; используйте ID контейнера как стабильный handle для чего-либо, что охватывает состояния.
- Логика переходов живет в
InstanceTransitions; изменение ID намеренно, не ошибка.