/make-video — étapes 2–4 : du choix à la release fusionnée
Entrée : sélection de l'utilisateur depuis le fichier ideas de cette worktree (« /make-video N » + modifications) ou un objet nommé par l'utilisateur.
Sortie = DoD (AGENTS.md, « Pipeline des conversations ») : out/<ep>/release/ — master <ep>_en_1080x1920p60.mp4 et publish_en.md, deux fichiers — transmis à l'utilisateur ; QA visuel accepté ; tout commité ; branche fusionnée dans main (video_wt.py finish) ; worktree supprimée.
Niveau exigé — docs/quality.md : du cinéma, pas de l'infographie ; les faits dans les mots, le spectacle dans l'image ; final en ≤ 6 h GPU.
Uniquement EN, durée cible 29–29,5 s, maximum 30,0 s (docs/shorts_format.md).
Liens : processus — docs/pipeline.md ; approbation — docs/approval.md ; package — docs/publish.md ; rôles — docs/workflows.md ; bibliothèque — docs/spacekit.md ; timing — docs/timings.md ; file d'attente — docs/render_queue.md ; agents, commits, pièges — AGENTS.md. Commandes : Git Bash depuis la racine de sa worktree ; <ep> = epNNN_<slug>.
Étape 0 — worktree, file d'attente, commits
- Branche
video/epNNN…après/next-video— continuer dedans. Conversation dans la copie principale sans/next-video—python tools/video_wt.py start→ ClaudeEnterWorktreeavecpath/ Codexworkdir. - Blender, TTS, musique, assemblage — uniquement via la file d'attente : tâche soumise → la conversation continue le travail textuel.
- Après chaque bloc — commit
type(<ep>): …avec le traileur du modèle. Fin de tour — arbre propre.
Partie A — avant approbation
- Épisode.
python tools/video_wt.py claim <slug>(slug —[a-z0-9_], ≤ 16, d'après le nom catalogue). Copierepisodes/_template/→episodes/<ep>/, dansepisode.json—id= nom du dossier,languages: ["en"](ne pas définir les cheminsframes_dir/audio_dir). À la fin du fichier ideas :Sélectionné : N, <date>, modifications : …, épisode : <ep>. Commitfeat(<ep>): épisode depuis la variante N. - Faits : chercheur + vérificateur de faits (
docs/workflows.md) →facts.md(chaque chiffre avec lien, références visuelles). Commit. - Brief visuel
visual_brief.md(rôle « Metteur en scène ») : références, premier plan, money shot, palette, lumière, caméra et événement de chaque plan, conventions, budget. Critique « Cinéma/wow » sur le brief → modifications. Commit. - Script
script_9x16.json(EN) : 6–8 segments, ancresat(s), 29–29,5 s (≤ 30.0 strict), ≈ 55–70 mots ; première phrase — accroche factuelle ; dernière ramène au début (boucle).en_cap— chiffres,|— sauts manuels (docs/pipeline.md, « Titres et sous-titres »). Voix de la chaîne — Kokoroaf_heart×0.98. Commit. - Scène et plans.
system.py(paramètres réels → écran, conventions — en docstring) ; manquant — modulesspacekit/(commit séparéfeat(spacekit): …, régressiontools/imgdiff.py).shots_9x16.pyselon le brief : 6–10 plans de 2–5 s, chacun ≥ 3 profondeurs, clé + contre, halo/bloom, mouvement caméra, flou de mouvement, fond non vide (docs/quality.md).episode.json(montage, overlaysen, sous-titres dans les zones sécurisées),music_cues.json(sa propre tonalité/mode/tempo). Collages — bout à bout, sur événements ; dernier plan = premier. Σ trames du montage ≤ 1799 à 60 fps.python tools/check_episode.py episodes/<ep>/episode.json. Commit. - Aperçu du timing :
python tools/render_queue.py submit preview episodes/<ep>/episode.json --with-tts, statut —status --json. Ficheout/<ep>/9x16/sheet_prev.png; pas de Traceback/OVERRUN, présence FLASH/EVENT ; cue-list —python tools/cues.py episodes/<ep>/episode.json --logs out/<ep>/9x16/logs. - Hero-shots : par plan
submit preview … --hero --shots vN --frames F,F+1,F+2(F — meilleur moment du plan ; 100 %, sans--samples— échantillons du code du plan, comme dans le final) →out/<ep>/9x16/hero/,sheet_hero.png. Aux critiques et au propriétaire — trame F ; d'après le loghero_vN.log— s/trame et ETA (docs/timings.md). Échantillons et effets lourds à ajuster dansshots_9x16.py(commit, hero à nouveau) pour que le final prenne 4–6 h, pas une heure. - Critique (
docs/workflows.md) : « Cinéma/wow » (note des plans 1–10, < 8 — refaire, jusqu'à 3 rounds), composition, rythme/accroche, faits (seulement 4 bloqueursdocs/quality.md) ; optionnel : unicité, son. Modifications → répéter 6–7. Rapports — fichiers dans l'épisode, commit par roundfix(<ep>): corrections suite à critique, round K. - Vidéo brouillon entière (
docs/approval.md, 1a) : fonctiondraftdans les plans +preview_movie.pyd'épisode viasubmit task. Non assemblée — à soumettre pour approbation sans elle, avec message « vidéo brouillon : non ». - Approbation : message selon modèle
docs/approval.md+ fichiers (hero-shots, vidéo brouillon). Commit de l'état. Arrête-toi et attends la réponse. Modifications — retour à l'étape nécessaire.
Partie B — après « ok » : jusqu'au DoD (sans questions, sauf arrêts de docs/approval.md)
- Approbation dans l'historique. Cue-list et
publish_en.mdprêts selondocs/publish.md(conventions — en liste). Commitchore(<ep>): approuvé pour rendu(modifications de l'utilisateur — dans le corps). - Final.
python tools/render_queue.py submit final episodes/<ep>/episode.json --approved 'approbation utilisateur : date, contexte conversation'. Le drapeau enregistre le consentement déjà obtenu, ne le remplace pas. À l'utilisateur — id de la tâche, PC, ETA. Le worker choisit lui-même le PC, rend par portions de 120 trames et exécute framecheck, TTS, musique, mix, build_edit, assemblage, QA machine et release. La conversation peut se fermer. - Statut et pannes.
status --json(progression —cursor/steps; les trames jusqu'à la fin de la tâche se trouvent dans l'instantanésnapshot, pas dansout/<ep>/).failed— log de l'étape dans l'instantané ; panne temporaire d'environnement —retry JOB; correction de code/script —cancel JOB, correction dans la worktree, si nécessaire nouvelle approbation, nouvelle tâche. Framecheck FAIL — analyser RERENDER, supprimer les mauvaises trames dans l'instantané (et sur le remote),retry JOB --rerender-shots vN.pause/resume— entre les portions. Ne pas tuer le bash parent. - QA visuel.
needs_review= vérifications machines et package prêts. PNGout/<ep>/9x16/qa_en/et master : pas moins bien que les hero-shots (bruit, flou, surexposition, scintillement), zones sécurisées, sous-titres, désynchronisation, boucle. Propre —python tools/render_queue.py accept JOB; défaut — correction et nouvelle tâche. - Transmission. Les deux fichiers
out/<ep>/release/à l'utilisateur (Claude — SendUserFile). Les sources ont changé pendant le rendu — comparer publish de l'instantané et JSON de montage avant le commit. - Comptabilité.
episodes/INDEX.md(plans, techniques, voix, tonalité, accroche), tableau des épisodes dansREADME.md, ✅ sujets dansdocs/channel.md, mesures s/trame dansdocs/timings.md, leçons — dans les docs de profil. Commitdocs(<ep>): comptabilité et leçons(code épisode,edit_9x16_en.json,publish_en.md; sansout/). - Fusion.
python tools/video_wt.py finish— propre → release → accept →git merge main→ check_episode et tests → ff main →out/<ep>/transféré dans la copie principale. Conflit — résoudre dans la worktree, commit, répéter. Puis sortir de la worktree (Claude —ExitWorktreekeep) et depuis la copie principalepython tools/video_wt.py remove epNNN; ne pas supprimer la worktree de l'application (start --here). C'est seulement maintenant — « prêt ».