Решения
Инварианты, без которых маршруты и варианты читаются неверно.
Предупреждение
Ниже только то, без чего маршруты читаются неверно.
Граница по вызову модели
Всё, что зовёт модель, живёт в TypeScript. Всё, что должно повторяться на том же входе, живёт в Python: разбор, вёрстка, экспорт, рендер и проверки файла.
Слои движка независимы
Парсер, вёрстка, графика, экспорт, рендер и проверки знают только контракты. Соединяет их API движка, поэтому вёрстку можно менять, не открывая парсер.
Нет условий под конкретный шаблон
В коде нет ветки «если шаблон такой-то» и нет зашитых цветов, шрифтов и координат. Всё, что зависит от файла, читается из его профиля.
Три прогона, один план
Один запуск генерации поднимает три прогона: dense, balanced и airy. План и иллюстрации общие. Артефакты и аудит у каждого варианта свои. Чем именно отличается композиция вариантов, не фиксируется этой страницей — см. три варианта.
Картинка один раз на бриф
Иллюстрация слайда готовится один раз и попадает во все три варианта. Слот, для которого картинки нет, экспорт убирает: пустая рамка выглядит как незаконченная работа.