short-form-video
This skill should be used when the user asks to "make a Reels/TikTok/YouTube Shorts video", "build a short-form video template", "write a hook for a short", "edit for retention", "add pattern interrupts", "make a video loop", "fix the first 3 seconds", "pace cuts for a vertical video", or "set up 9:16 safe areas". Covers the hook→retention→loop grammar of vertical short-form (distinct from a launch hype film).
1How It Works & Mechanism
Positioning first: Short-form video is not a "mini launch film" but a retention machine; the working unit is the retention curve, not the edit point.
You are editing the *curve*, and the hook gates everything after it — fix it first.
Narrative discipline: A single video holds only one payoff; open the loop in the first ~3 seconds and close it only at the very end.
- **One idea per video.** A short carries exactly one payoff.
The retention arc provides a second-by-second budget (hook 0–1s / setup 1–4s / body 4–17s / payoff 17–20s) and mandates expanding only the body, never the hook.
Scale the *body*, never the hook.
Two hard rules for hooks: Copy must appear on frame 1, and the most compelling visual must be the first frame (no fade-in from black).
the hook line is **on-screen as text by frame 1** (85% watch muted), and the most striking *visual* is also the first frame — never a slow ramp-in.
Pacing is governed by pattern interrupt density: A visual change roughly every 2–4 seconds, with deliberately uneven intervals.
a *visual change every ~2–4 seconds*
Looping serves as retention leverage: Matching first and last frames plus sentence wrap-around counts rewatches as fresh watch time.
match the **last frame to the first** (same composition, position, color) so the cut is invisible
Vertical safe areas are defined as a pixel-level intersection: A centered 900×1400 box, leaving ~120px top, ~320px bottom, and ~120px right empty.
| Universal safe (all platforms) | center **900×1400** | anything critical outside it |
Explicit capability boundary: Subtitle animation is not implemented in this skill and is delegated explicitly to caption-animation.
**Do not re-implement caption animation here** — use the `caption-animation` skill for word-by-word timing, karaoke highlight, and styling
Verification loop designed around three checks: Hook readability at a glance, pacing free of flat mid-sections, and invisible loop seams.
LOOP seam: compare f-hook(frame 0) vs f-end(last frame) — same composition/position/color for an invisible loop cut
2Core Capabilities
3External Dependencies
| Kind | Dependency / Endpoint |
|---|---|
| cli | npx remotion still / render / compositions |
| cli | scripts/contact-sheet.sh + scripts/probe-mp4.sh(仓库根共享验证工具箱,SKILL.md 明列) |
| package | ffmpeg / ffprobe(系统依赖) |
| cli | 跨 skill 委派:caption-animation(同仓另一个 skill,负责词级字幕动画) |
4Recommended Governance & Evidence
- scripts/: Local script or command execution: (Verification loop explicitly specified in SKILL.md) `npx remotion still Short out/f-{hook,mid,end}.png --fram
- 网络端点: Declared external network access: `npx remotion …`: Fetches packages and CLI from official npm channels (registry.npmjs.org, domain determined by npm, not hardcoded in source) on first run
- 本地工作目录: File I/O and artifact output: Remotion projects generated by agent per skill guidelines, writing out/short.mp4 and out/demo.gif
5Second-Pass Verification
- [discrepancy] 「hook 必须在第 1 帧上屏」与验证示例取 frame=10 是否矛盾(第一遍未察觉) — SKILL.md 的硬规则写 "the hook line is **on-screen as text by frame 1**",收尾清单第 2 条也写 "on-screen text + strongest visual up front";但验证示例给的是 `npx remotion still Short out/f-hook.png --frame=10 --props=…`,并注释「~first 3s reads instantly」。10 帧 @30fps ≈ 0.33s,若 hook 文案在 frame 0 才起动画、到 frame 10 才稳定,则两者可并存(示例取的是「稳定可读帧」而非「首帧」);但文档未说明这一区别,读者可能据此把 hook 动画起始推到第 10 帧,直接违反 frame 1 规则。属对 pin commit 有效的表述出入,非虚假声明。
- [unlocatable] 留存统计数字是否有出处(87% / 70% / 平台阈值 / 58% vs 41%) — SKILL.md 写 "~87% decide to stay or swipe inside 3 seconds"、"the threshold for distribution sits near **70%+ average view-through** (Shorts ~73%, TikTok ~78%, Reels ~65%)"、"videos with an interrupt roughly every 4s hold ~58% vs ~41% for a static talking head"。仓库内无引用来源、无数据集、无计算脚本;本次为只读侦查且不运行分析,故不验证这些数值,仅记为文档声明(reference 另有 "Target ≥70% average view-through." 同源)。结论中不把它们当作已核事实。
- [ok] 安全区数值在 SKILL.md 与 reference 实现里是否一致 — SKILL.md 表:center 900×1400、top ~120px、bottom ~320px、right ~120px;reference §2 SafeZone 组件逐值对应(`left: 90, top: 260, width: 900, height: 1400` 的框,加高 120 的顶部红带、高 320 的底部红带、宽 120 的右栏),§5 表首行也是「Universal (use this) | ~120px | ~320px | ~120px | center 900×1400 holds on all」。两侧完全自洽。
- [ok] 「不留平坦中段」是否有可执行机制,而非只靠审美 — reference §1 给出帧驱动的 `useShot(cuts)` 调度器与刻意参差的 cuts 数组(`cuts = [0, 1.2, 3.0, 5.4, 8.0, 11.2, 14.0]; // seconds — uneven on purpose`),并配 PunchIn(在切点 snap 到 1.1–1.12 倍);§4 排障表把「中段持平后骤降」映射到「add interrupts; tighten cut spacing to 2–4s」。机制存在且与主张对应。
- [ok] 跨 skill 委派是否指向真实存在的 skill(防悬空指引) — SKILL.md 指名 `caption-animation`;该 skill 确实位于同一仓库(skills/caption-animation/SKILL.md,本批次同批侦查)。委派目标存在,且其描述覆盖 word-by-word timing 与 active-word highlight,与本 skill 的说法一致。
- [ok] 跨包共享脚本与 Packaged helper 引用是否真实(防悬空引用) — SKILL.md 只点名 scripts/contact-sheet.sh 与 scripts/probe-mp4.sh,两者在仓库根存在且可执行,三仓库逐字节相同(md5 b7dcc28034c9bf8fda5d48683e54d8b5 / 167b7977c50f492014e1a6fef8c9ed12)。seek-shot.sh 未被本 skill 点名。
6Verdict & Scenarios
976ced5900c4ae4f…