| name | video-producer |
| description | Routes a video-generation request to the right LOCAL video skill and chains them end-to-end (decompose -> route -> chain -> render -> verify). Use when the user asks to "make a video", "create a video", "영상 만들어줘", "영상 제작", "비디오 생성", motion graphics, explainer/demo video, math animation, multi-scene video, or to edit raw footage into a finished clip. Picks among hyperframes / remotion-motion-forge / manim-video / video-use / openmontage / ffmpeg-toolkit by intent, offloads heavy renders to subagents, and verifies the output MP4. Do NOT use when the user names a single tool ("manim으로", "remotion으로" -> call that skill directly), for TTS/STT only (use [[tts-generation]]/[[stt-generation]]), or for image generation (use gpt-image-2/muapi). |
Video Producer — Local Video Skill Router
Thin routing brain over the 6 installed video skills. Capability lives in those skills
([[thin-harness-fat-skills]]); this skill only decides which tool, in what order, then
offloads execution and closes with a verify gate. It does NOT re-implement rendering.
IR (intent contract)
- intent: turn a video brief into one finished
.mp4 by routing to the correct local skill.
- triggers: 영상 만들어줘 / 영상 제작 / 비디오 생성 / make|create a video / explainer / motion graphics / 수학 애니메이션 / 멀티신 영상 / 소재 편집.
- inputs: a brief (topic/script/footage), optional aspect ratio (16:9/9:16), optional narration.
- outputs: a verified
.mp4 under outputs/video/{slug}/ + one-line summary of tool chain used.
- boundaries: single-tool-by-name, TTS/STT-only, image-gen -> not here.
- references: the 6 sub-skills below + rules [[tts-generation]], [[subagent-model-routing]], [[close-the-agent-loop]].
Step 1 — Route (intent -> tool). Pick the FIRST that matches.
| If the brief is... | Route to | Notes |
|---|
| Editing existing raw footage (cut, grade, subtitle, overlay, filler-word removal, EDL) | video-use | needs source clips; ffmpeg-backed |
| Math / equation / algorithm / concept / 3D-math animation | manim-video | LaTeX optional (MathTex only); Text/shapes work without it |
| Multi-scene full production from a topic/research (script->assets->edit->compose) | openmontage | repo ~/thaki/OpenMontage; 11 pipelines |
| HTML/CSS composition: title cards, captions synced to audio, audio-reactive, transitions, TTS narration | hyperframes (+ hyperframes-cli, hyperframes-media) | deterministic npx hyperframes render |
| React / design-system / template mass-render with dynamic props | remotion-motion-forge | per-project npm install |
| Pure encode / compress / concat / format-convert / final mux | ffmpeg-toolkit | also the final-assembly step for every chain |
Ambiguous between two? State the pick + one-line reason, then proceed (no back-and-forth unless the source/aspect is genuinely unknown). When the user names a tool, skip this table and call it directly.
Step 2 — Chain (compose, don't reinvent)
- Narration: generate audio via [[tts-generation]] (
scripts/tts/tts_generate.py, VoxCPM2 user-voice clone) BEFORE timing the visuals. Never read bullet fragments — full 종결어미 sentences.
- Final assembly: any chain's final concat/encode goes through ffmpeg as one continuous audio + single mux with 0.4–0.6s tail padding ([[tts-generation]] §3) — never per-clip
-c copy concat (AAC priming gap = cut audio).
- openmontage already calls ffmpeg internally; do not double-encode its output.
Step 3 — Render offload (token hygiene, [[subagent-model-routing]])
Heavy renders are CPU-bound and noisy. Dispatch them to a subagent and get back only the output path + status — never stream render logs into main context ([[ecc-token-strategy]] 2K rule).
| Render step | Subagent model |
|---|
| Pure ffmpeg encode/concat | haiku |
| manim / remotion / hyperframes render | sonnet |
| Creative composition authoring (taste calls) | main context (sonnet) — interactive, show intermediate |
Step 4 — Verify gate (close-the-loop, code-owned)
Before reporting done, a deterministic check ([[close-the-agent-loop]] code path — this is single-output, so code gate not adversarial vote):
ffprobe -v error -show_entries format=duration -of csv=p=0 "$OUT" 2>/dev/null
VERDICT: PASS only when the ffprobe check above succeeds (file exists AND duration > 0 AND duration >= 0.6×expected); any other result = FAIL. Verify this gate before reporting done — never deliver on FAIL.
Fail -> re-render the failing segment, do not deliver. Output path: outputs/video/{slug}/{name}.mp4.
Prerequisites (audited 2026-07-12)
ffmpeg 7.1.1 · node v22 · manim 0.20.1 (.venv/bin/manim) · Google Chrome.app (hyperframes/remotion headless render) · yt-dlp (video-use download) · ~/thaki/OpenMontage cloned.
- 2026-07-12 heal: manim (
VIRTUAL_ENV=.venv uv pip install manim, [[python-runtime]]) and OpenMontage (git clone https://github.com/calesthio/OpenMontage.git ~/thaki/OpenMontage) were missing despite the prior "all present" claim — reinstalled. Re-verify with .venv/bin/manim --version and ls ~/thaki/OpenMontage/Makefile before trusting this line.
- OpenMontage first-run: needs its own venv — run
make setup in ~/thaki/OpenMontage once before the first render (Makefile ensure-venv/setup), else the multi-scene route fails on a missing interpreter.
Optional: LaTeX (manim MathTex equations only) — brew install --cask basictex if equations needed. Other 5 tools unaffected.
gotchas
- Do NOT replace
openmontage — it is one of 6 routes (multi-scene full production), not a competitor. This skill is the dispatcher above it.
- hyperframes/remotion npm packages download on first
npx run (network to npmjs) — not a missing-dep error.
- video-use needs source footage; if none provided, it's the wrong route — re-route to a generator (manim/hyperframes/remotion).
- Don't auto-install mactex (4GB). BasicTeX suffices for equations; most videos need no LaTeX.
- This is a router for quality video output. A one-off
ffmpeg -i a.mp4 ... the user fully specified is native — don't over-route ([[token-diet-hygiene]]).