Каждый листовой материал — это nesting-группа, за которой стоит завершённая запись nesting_runs. Конфигурация изделия хранит упорядоченный список nesting_run_ids; она никогда не хранит вторую изменяемую копию размещений или остатков. group_metadata определяет компонент, материал, отпечаток входных данных листа и подписи для отображения. Обычный (generic) расчёт имеет один legacy-прогон и отображается как группа PROJECT.
Публичный payload расчёта содержит nesting_groups. Каждая группа включает размеры листа, размещения, листы, остатки, коэффициент использования, списанную и возвращённую площадь. group_payload в backend/app/nesting_workspace.py вычисляет итоговые площади из сохранённого прогона. Калькуляция стоимости использует эти итоги напрямую. Разбивка изделия получает только сводку для чтения — без размещений и остатков. Старое поле nesting сохраняется для обычных расчётов и равно null для активных изделий.
Channel Letters добавляет BACK и FACE через материалы технологии NESTED_SHEET. Конфигурация может содержать любое число таких материалов. Отпечаток (fingerprint) из геометрии, выбранного материала, размеров листа, зазора и поля определяет, можно ли переиспользовать каждый прогон. Пересчёт заменяет только изменившиеся группы и сохраняет остальные run ID и ручные решения по остаткам. Общая логика detect_remnants сохраняет существующие умолчания для обрезков, нижней полосы и пригодных остатков в каждой группе. Эндпоинты размещений и остатков на уровне группы проверяют, что прогон принадлежит расчёту и текущей конфигурации изделия.
Миграция b8e3f9276a10 переносит существующие раскладки изделий в общие прогоны. Она сохраняет обычные прогоны, сохранённые ревизии, опубликованные технологии, цены и итоговые суммы предложений. Исторические ревизии, созданные до миграции, используют адаптер только для чтения; продолжение такой ревизии переносит её раскладки в общие прогоны. Эта миграция входит в новый релиз и ещё не применялась на production.