# Производственный процесс 2.2

## Порядок проходов рендера

Порядок не вкусовой: каждый шаг ниже опирается на результат предыдущего, и
перестановка ломает либо шкалу, либо картинку.

```
исходник
  → voice_restore          (звук чинится до нарезки; видео копируется)
  → plan/render_speech_recut
  → plan/render_cold_open  (шкала сдвигается ЗДЕСЬ, дальше её никто не двигает)
  → plan_retention → render_punch_ins
  → apply_grade
  → render_broll_overlay   (если вставки прошли отбор по кадру, а не по тегам)
  → burn_ass_captions      (титры всегда последними по картинке)
  → mix_music_bed
  → audio_fx               (громкость нормализуется ОДИН раз, здесь)
  → run_quality_gates
```

Два правила, которые чаще всего нарушают:

- **Панч-ины до прожига титров.** Иначе зум применяется к субтитрам, и они
  дышат вместе с кадром.
- **Холодный старт до субтитров.** Он сдвигает весь корпус на
  `длина хука − длина перехода` и обязан пересчитать производные поля таймлайна.
  Собранные раньше титры после него неверны на полторы секунды.

## 1. Приём

1. Распаковать архив во временную папку.
2. Просканировать **все** медиа через `discover_sources.py`.
3. Составить реестр файлов и контрольных сумм.
4. Сохранить начало/середину/конец каждого видео в контрольный лист.
5. Не выбирать источник автоматически, если найдено несколько кандидатов.

## 2. Расшифровка

Каждый исходник расшифровывается отдельно. Результат должен отражать реальную речь, включая разговорное начало, повторы и оговорки. Сценарий — только словарь.

## 3. Порядок и стыки

Сравнить транскрипты. Найти:

- продолжение;
- повтор последней фразы;
- второй дубль;
- финальный призыв;
- техническую тишину.

Создать `stitch_plan.json`, собрать базу через `stitch_media.py`, затем единую `timeline.json`.

## 4. Редактура

Можно исправить написание бренда или имени, но нельзя:

- менять набор слов без подтверждения звуком;
- добавлять заголовок;
- переставлять слова;
- расширять финал текстом из сценария.

## 5. Монтажная карта

Каждая сцена имеет:

- ссылку на слова начала/конца;
- глобальное время после склейки;
- источник;
- смысл;
- тип визуала;
- движение;
- кадрирование;
- звук;
- проверку безопасной зоны.

## 6. База

Говорящая голова и её родной звук образуют единый базовый слой. Вырезки выполняются по `stitch_plan.json`. Б-роллы и графика лежат поверх и не изменяют базовую временную шкалу.

## 7. Дизайн и материалы

Приоритет:

1. материалы пользователя;
2. реальные стоковые видео;
3. реальные/сгенерированные изображения с мягким движением;
4. HyperFrames-графика;
5. абстракция.

Все изображения — без встроенного текста. Типографика выполняется отдельно.

**Б-ролл отбирается по кадру, а не по тегам и не по лицензии.** Совпадение по
смыслу — не совпадение по форме. Годность проверяется тремя признаками:
ориентация под канвас, отсутствие чужого текста в кадре, заполненность кадра
содержанием. Горизонтальный скринкаст с английскими подписями и большим чёрным
полем в вертикальном русском ролике хуже, чем отсутствие вставки. Не подошло —
окно закрывается рефреймом, а не вставкой «раз уж скачали».

## 8. HyperFrames

- `doctor` перед началом;
- `lint --json` и `inspect --json` после каждой структурной правки;
- `preview` с покадровым просмотром;
- явная общая длительность;
- анимации только от `hf-seek`/адаптеров.

## 9. Звук

Не разрывать родной звук и видео. Музыка и эффекты добавляются после того, как голос и губы совпадают. Никакая музыка не должна маскировать проблему синхронизации.

## 10. Приёмочные рендеры

Рендерить по очереди:

- 0–15 секунд;
- каждый стык ±2 секунды;
- последние 5 секунд;
- полный ролик.

## 11. Проверки

- `validate_sync.py`;
- `validate_full_end.py`;
- `validate_render.py`;
- контрольные кадры на временных метках слов;
- прослушивание на скорости 1× и 0,5×;
- проверка последнего слова и последнего кадра.

## 12. Выдача

Финальное имя уникально. В комплект входят MP4, SRT/ASS, `timeline.json`, транскрипт, отчёты и контрольный лист. Секреты и файлы шрифтов не прикладываются.
