# Модуль: Сборка документа **Ответственность**: выполняет use case «собрать документ» в фиксированном порядке от пользовательских параметров до вызова renderer. **Расположение**: `.template/lib/application/render-document.typ` ## Публичный интерфейс | Символ | Тип | Описание | |--------|-----|----------| | `render-document()` | функция | Оркестрирует resolve company → normalize → validate → create context → render | | `resolve-profile()` | функция | Проверяет и нормализует встроенный или пользовательский `DocumentProfile` | | `build-context()` | функция | Создаёт итоговый `DocumentContext` из валидированных частей | ## Зависимости | Модуль | Что использует | |--------|----------------| | `.template/lib/domain/document.typ` | Контракт профиля, context и render options | | `.template/lib/domain/company.typ` | Валидацию CompanyProfile | | `.template/lib/domain/parties.typ` | Валидацию сторон и подписантов | | `.template/lib/domain/attachments.typ` | Валидацию приложений | | `.template/lib/infrastructure/company-assets.typ` | Загрузку компании только если передан строковый id | ## Инварианты - Renderer никогда не вызывается до завершения всех validators. - Строковый `company` разрешается infrastructure-адаптером; готовый `CompanyProfile` повторно не загружается. - Порядок normalize и validate одинаков для всех профилей. - Application не содержит `if profile.id == "report"` или другой profile-specific логики. - `body` передаётся renderer без изменения пользовательского content. - Ошибка содержит stage: `resolve-company`, `normalize-profile`, `validate-domain` или `render`. ## Намеренно НЕ обрабатывает - Page layout и show rules. - Чтение пользовательского `assets/`. - Юридическую проверку содержимого. - Запуск Typst compiler или запись PDF на диск. ## Заметки для агента > Этот модуль должен оставаться коротким и скучным: его ценность — стабильный pipeline. Если новая возможность требует ветвления по профилю, добавьте её в profile contract или domain service. Infrastructure подключается как адаптер только для удобного строкового company id.