/make-video — ステップ2~4:選択からマージリリースまで
入力:ユーザーがworktree内のideasファイルから選択(「/make-video N」+修正)またはユーザーが名前を付けたオブジェクト。
出力 = DoD(AGENTS.md、「チャットパイプライン」):out/<ep>/release/ 内のマスターファイル <ep>_en_1080x1920p60.mp4 と
publish_en.mdの2ファイルをユーザーに受け渡し。ビジュアルQA合格。全てコミット済み。ブランチをmainにマージ(video_wt.py finish)。worktree削除済み。
基準 - docs/quality.md:映画的品質、インフォグラフィックではない。事実は言葉で、見せ場は映像で。最終レンダリングはGPU 6時間以内。
言語は英語のみ。目標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。コマンドは各worktreeのルートでGit Bashから実行。<ep> = epNNN_<slug>。
ステップ0 — worktree、キュー、コミット
- ブランチ
video/epNNN...は/next-video後に継続。メインコピーで/next-videoなしのチャットはpython tools/video_wt.py start→ ClaudeはEnterWorktree(path指定)/ Codexはworkdir。 - 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ファイルの末尾に追記:Selected: N, <日付>, edits: ..., episode: <ep>。 コミットfeat(<ep>): episode from variant N。 - 事実調査:リサーチャー+ファクトチェッカー(
docs/workflows.md)→facts.md(各数値にリンク付き、ビジュアルリファレンスも)。コミット。 - ビジュアルブリーフ
visual_brief.md(役割:ディレクター):リファレンス、ファーストフレーム、マネーショット、パレット、照明、カメラと各ショットのイベント、コンベンション、予算。批評家「シネマ/ワウ」がブリーフをレビュー→修正。コミット。 - スクリプト
script_9x16.json(英語):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(編集、enオーバーレイ、セーフゾーン内の字幕)、music_cues.json(独自の調性/モード/テンポ)。 カットはイベントでつなぐ。最後のフレーム=最初のフレーム。 編集フレーム数合計 ≤ 1799(60fps時)。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で生成。 - ヒーローフレーム:ショットごとに
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で調整(コミット後、ヒーローフレームを再レンダリング)し、最終レンダリングが 4~6時間 になるようにする(1時間にならないように)。 - 批評(
docs/workflows.md):「シネマ/ワウ」(各ショット1~10点評価、8点未満は修正、最大3ラウンド)、構図、 リズム/フック、事実の正確性(docs/quality.mdの4つのブロッカーのみ)。オプション:独自性、音声。修正後はステップ6~7を繰り返す。 レポートはエピソードフォルダ内のファイルとして保存。各ラウンドごとにコミットfix(<ep>): fixes from critique, round K。 - ドラフト動画全体(
docs/approval.md、1a):ショットにdraft機能を追加し、エピソード全体のpreview_movie.pyをsubmit taskで実行。生成できない場合はドラフトなしで承認に進み、メッセージに「draft video: not available」と記載。 - 承認:
docs/approval.mdのテンプレートに従ったメッセージ+ファイル(ヒーローフレーム、ドラフト動画)。状態をコミット。 停止して応答を待機。 修正指示があれば該当ステップに戻る。
パートB — 「OK」後:DoDまで(docs/approval.md記載の停止以外は質問なし)
- 承認の記録 合意済みのcueリストと
publish_en.mdをdocs/publish.mdに従って準備(コンベンションはリスト形式)。コミットchore(<ep>): approved for render(ユーザーの修正内容はコミットメッセージ本文に)。 - 最終レンダリング
python tools/render_queue.py submit final episodes/<ep>/episode.json --approved 'user approval: date, chat context'。--approvedフラグはすでに得られた同意を記録するものであり、同意に代わるものではない。 ユーザーにはジョブID、レンダリングPC、ETAを通知。Workerが自動的にPCを選択し、120フレームずつレンダリング、フレームチェック、TTS、音楽、ミックス、編集ビルド、合成、機械QA、リリースを実行する。チャットはここで閉じてもよい。 - ステータスと障害
status --json(進捗はcursor/stepsで確認。未完了のジョブのフレームはスナップショットsnapshotに保存され、out/<ep>/にはない)。failedが返った場合、スナップショット内に該当ステップのログがある。環境の一時的な障害はretry JOB。コード/スクリプトの修正が必要な場合はcancel JOB、worktreeで修正、必要に応じて再承認、新規ジョブ投入。フレームチェックFAILの場合はRERENDERを分析、スナップショット内(およびリモート)の不良フレームを削除、retry JOB --rerender-shots vNを実行。pause/resumeはバッチ間で使用可能。ルートbashを終了しない。 - ビジュアルQA
needs_reviewステータスは機械チェックとパッケージ準備完了を示す。out/<ep>/9x16/qa_en/内のPNGとマスターファイルを確認:ヒーローフレームより劣っていないか(ノイズ、ぼけ、露出オーバー、フリッカー)、セーフゾーン、字幕、リップシンク、ループ。問題なければ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>): accounting and lessons(エピソードコード、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を実行。start --hereで作成したworktreeは削除しない。これで「完了」。