/make-video — шаги 2–4: от выбора до влитого релиза
Вход: выбор пользователя из ideas-файла этой worktree («/make-video N» + правки) или объект, названный пользователем.
Выход = DoD (AGENTS.md, «Конвейер чатов»): out/<ep>/release/ — мастер <ep>_en_1080x1920p60.mp4 и
publish_en.md, два файла — передан пользователю; визуальный QA принят; всё закоммичено; ветка влита в main
(video_wt.py finish); worktree убрана.
Планка — docs/quality.md: кино, а не инфографика; факты — в словах, зрелище — в картинке; финал до 6 ч GPU.
Только EN, цель 29–29,5 с, максимум 30,0 с (docs/shorts_format.md).
Ссылки: процесс — docs/pipeline.md; одобрение — docs/approval.md; пакет — docs/publish.md; роли —
docs/workflows.md; библиотека — docs/spacekit.md; время — docs/timings.md; очередь — docs/render_queue.md;
агенты, коммиты, грабли — AGENTS.md. Команды — Git Bash из корня своей worktree; <ep> = epNNN_<slug>.
Шаг 0 — worktree, очередь, коммиты
- Ветка
video/epNNN…после/next-video— продолжать в ней. Чат в основной копии без/next-video—python tools/video_wt.py start→ ClaudeEnterWorktreeсpath/ Codexworkdir. - Blender, TTS, музыка, сборка — только через очередь: задание поставлено — чат продолжает текстовую работу.
- После каждого блока — коммит
type(<ep>): …с трейлером модели. Конец хода — чистое дерево.
Часть A — до одобрения
- Эпизод.
python tools/video_wt.py claim <slug>(slug —[a-z0-9_], ≤ 16, по каталожному имени). Скопироватьepisodes/_template/→episodes/<ep>/, вepisode.json—id= имя папки,languages: ["en"](путиframes_dir/audio_dirне задавать). В конец ideas-файла:Выбран: N, <дата>, правки: …, эпизод: <ep>. Коммитfeat(<ep>): эпизод из варианта N. - Факты: исследователь + фактчекер (
docs/workflows.md) →facts.md(каждое число со ссылкой, визуальные референсы). Коммит. - Визуальный бриф
visual_brief.md(роль «Постановщик»): референсы, первый кадр, money shot, палитра, свет, камера и событие каждого шота, условности, бюджет. Критик «Кино/вау» по брифу → правки. Коммит. - Сценарий
script_9x16.json(EN): 6–8 сегментов, якоряat(с), 29–29,5 с (≤ 30.0 жёстко), ≈ 55–70 слов; первая фраза — факт-крючок; финальная подводит к началу (петля).en_cap— цифры,|— ручные разрывы (docs/pipeline.md, «Титры и субтитры»). Голос канала — Kokoroaf_heart×0.98. Коммит. - Сцена и шоты.
system.py(реальные параметры → экран, условности — в docstring); недостающее — модулямиspacekit/(отдельный коммитfeat(spacekit): …, регрессtools/imgdiff.py).shots_9x16.pyпо брифу: 6–10 шотов по 2–5 с, в каждом ≥ 3 плана глубины, ключ + контр, ореол/блум, движение камеры, моушн-блюр, фон не пустой (docs/quality.md).episode.json(edit, оверлеиen, субтитры в безопасных зонах),music_cues.json(своя тональность/лад/темп). Склейки — встык, на событиях; последний кадр = первый. Σ кадров монтажа ≤ 1799 при 60 fps.python tools/check_episode.py episodes/<ep>/episode.json. Коммит. - Превью тайминга:
python tools/render_queue.py submit preview episodes/<ep>/episode.json --with-tts, статус —status --json. Листout/<ep>/9x16/sheet_prev.png; нет Traceback/OVERRUN, есть FLASH/EVENT; cue-лист —python tools/cues.py episodes/<ep>/episode.json --logs out/<ep>/9x16/logs. - Hero-кадры: по шоту
submit preview … --hero --shots vN --frames F,F+1,F+2(F — лучший момент шота; 100 %, без--samples— сэмплы из кода шота, как в финале) →out/<ep>/9x16/hero/,sheet_hero.png. Критикам и владельцу — кадр F; по логуhero_vN.log— с/кадр и ETA (docs/timings.md). Сэмплы и тяжёлые эффекты подобрать вshots_9x16.py(коммит, hero заново) так, чтобы финал занял 4–6 ч, а не час. - Критика (
docs/workflows.md): «Кино/вау» (оценка шотов 1–10, < 8 — переделка, до 3 раундов), композиция, ритм/хук, факты (только 4 блокераdocs/quality.md); опц. уникальность, звук. Правки → повтор 6–7. Отчёты — файлами в эпизоде, коммит на раундfix(<ep>): правки по критике, раунд K. - Черновое видео целиком (
docs/approval.md, 1a): функцияdraftв шотах + эпизодныйpreview_movie.pyчерезsubmit task. Не собирается — на одобрение без него, в сообщении «черновое видео: нет». - Одобрение: сообщение по шаблону
docs/approval.md+ файлы (hero-кадры, черновое видео). Коммит состояния. Остановись и жди ответа. Правки — назад к нужному шагу.
Часть B — после «ок»: до DoD (без вопросов, кроме остановок из docs/approval.md)
- Одобрение в истории. Готовы согласованный cue-лист и
publish_en.mdпоdocs/publish.md(условности — списком). Коммитchore(<ep>): одобрено к рендеру(правки пользователя — в теле). - Финал.
python tools/render_queue.py submit final episodes/<ep>/episode.json --approved 'одобрение пользователя: дата, контекст чата'. Флаг записывает уже полученное согласие, а не заменяет его. Пользователю — id задания, ПК, ETA. Worker сам выбирает ПК, рендерит порциями по 120 кадров и выполняет framecheck, TTS, музыку, mix, build_edit, сборку, машинный QA и release. Чат может закрываться. - Статус и сбои.
status --json(прогресс —cursor/steps; кадры до конца задания лежат в снимкеsnapshot, не вout/<ep>/).failed— лог шага в снимке; временный сбой среды —retry JOB; правка кода/сценария —cancel JOB, правка в worktree, при необходимости новое одобрение, новое задание. Framecheck FAIL — разобрать RERENDER, удалить плохие кадры в снимке (и на remote),retry JOB --rerender-shots vN.pause/resume— между порциями. Верхний bash не убивать. - Визуальный QA.
needs_review= машинные проверки и пакет готовы. PNGout/<ep>/9x16/qa_en/и мастер: не хуже hero-кадров (шум, мыло, пересвет, мерцание), безопасные зоны, субтитры, рассинхрон, петля. Чисто —python tools/render_queue.py accept JOB; дефект — правка и новое задание. - Передача. Оба файла
out/<ep>/release/пользователю (Claude — SendUserFile). Исходники менялись во время рендера — сверить publish из снимка и монтажный JSON перед коммитом. - Учёт.
episodes/INDEX.md(шоты, приёмы, голос, тональность, хук), таблица эпизодов вREADME.md, ✅ темы вdocs/channel.md, замеры с/кадр вdocs/timings.md, уроки — в профильные доки. Коммитdocs(<ep>): учёт и уроки(код эпизода,edit_9x16_en.json,publish_en.md; безout/). - Влитие.
python tools/video_wt.py finish— чисто → release → accept →git merge main→ check_episode и тесты → ff main →out/<ep>/переносится в основную копию. Конфликт — решить в worktree, коммит, повтор. Затем выйти из worktree (Claude —ExitWorktreekeep) и из основной копииpython tools/video_wt.py remove epNNN; worktree от приложения (start --here) не удалять. Только теперь — «готово».