1实现原理 · 为什么它能做到
定位先行:短视频不是「小号 launch film」,而是留存机器;工作单位是留存曲线,不是剪辑点。
You are editing the *curve*, and the hook gates everything after it — fix it first.
叙事纪律:一条片只装一个 payoff,且首 ~3 秒开环、最后才闭环。
- **One idea per video.** A short carries exactly one payoff.
留存弧给出秒级预算(hook 0–1s / setup 1–4s / body 4–17s / payoff 17–20s),并规定只放大 body,永不放大 hook。
Scale the *body*, never the hook.
hook 的两条硬规则:文案在第 1 帧就上屏、最抢眼的画面就是第一帧(禁止从黑淡入)。
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.
节奏靠 pattern interrupt 密度控制:每约 2–4 秒一次视觉变化,且间隔必须不均匀。
a *visual change every ~2–4 seconds*
循环是留存杠杆:首末帧匹配 + 句子回环,把重看计成新鲜观看时长。
match the **last frame to the first** (same composition, position, color) so the cut is invisible
竖屏安全区被写成像素级交集合:中心 900×1400,顶部 ~120、底部 ~320、右侧 ~120 全部留空。
| Universal safe (all platforms) | center **900×1400** | anything critical outside it |
能力边界写明:字幕动画不在本 skill 实现,指名交给 caption-animation。
**Do not re-implement caption animation here** — use the `caption-animation` skill for word-by-word timing, karaoke highlight, and styling
验证回路针对三件事设计:hook 是否一眼读懂、节奏是否没有平坦中段、循环接缝是否隐形。
LOOP seam: compare f-hook(frame 0) vs f-end(last frame) — same composition/position/color for an invisible loop cut
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| 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,负责词级字幕动画) |
4风险提醒 风险提醒:蓝色 · 知晓即可
- 引用大量平台统计数字却无出处 — 87%/70%+/58% vs 41% 等数字在仓库内无引用(见 second_pass unlocatable 条)。它们读起来像事实,容易被直接写进客户提案;建议只当经验值用,并以自己后台的留存曲线为准(reference §4 的排障表才是可操作部分)。
- hook 帧号口径不一(frame 1 vs 示例 frame=10) — 两处并存且文档未加说明,agent 照抄示例就可能把开场动画起点推后到 0.33s,违反「首帧即 hook」的硬规则(见 discrepancy 条)。
- 验收完全靠人读静帧,无自动断言 — 「一眼读懂」「节奏有没有平坦」「接缝是否隐形」都由 agent 看图判断;probe-mp4 只验成片规格,contact-sheet 只负责拼图。批量 N 个 topic 时这是唯一防线,且主观性高。
- dev-only 的 SafeZone 叠加层可能被带进成片 — reference 明写「delete it before the final export」,但这是纪律而非机制(没有开关自动在 render 时禁用),忘记删除会直接在产出片里留下红蓝参考线。
- 跨 skill 依赖与安装方式 — 字幕链路依赖同仓的 caption-animation;只安装单个 skill 目录时既拿不到 caption-animation,也拿不到仓库根 scripts/,验证回路与字幕能力同时失效。
5第二遍独立确认
- [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 点名。
6结论
976ced5900c4ae4f…2a775336b5