video-storytelling
Design and build the visual layer of a long-form talking-head video as one persistent world the camera moves through, instead of a sequence of separate graphics. Use when asked to edit a video, add motion graphics, design the visuals for a script, plan an edit, or fix an edit judged confusing, text-heavy, hard to follow, or "clearly made by an AI". Covers the persistent world, camera grammar, the spotlight rule, spatial open loops, ornament and token discipline, transcript timing, and the verification gates.
1实现原理 · 为什么它能做到
要治的病是「场景思维」:每几秒换一张新图会让观众每几秒重启一次理解,而失败反馈会以模糊的「看不懂/太满」出现,而不是具体缺陷。
The failure this replaces is scene-thinking. … rather than as a specific defect.
一个持久世界:全片同一空间且永不重置,已出现的元素不被重绘、移动或改标;空间语法在建任何东西前定好并贯穿全片。
### One persistent world … An element, once drawn, is never redrawn, moved, or relabelled.
相机即剪辑:切到新图形会夺走观众方位感,而在不动的空间里移动不付费;并给出 World/Region/Detail 三高度与相邻移动规则。
### The camera is the edit … Moving through a space that stays put costs them nothing.
注意力是聚光灯:任意时刻只有一个元素全亮,其余已画元素保持安静但可读;层级来自亮/静的比值,而不是把整体压暗。
**Exactly one element at full brightness at any moment. Everything else already drawn stays quiet but legible.**
开环是空间性的:不说「我们稍后再回来」,而是在世界里留下可见的未完成物,并按脚本形状选几何(并列项/深流程/分层/对比/新闻/教程)。
Never say "we'll come back to this." Leave something visibly incomplete in the world and return to it.
元素纪律:没被念到就不画——每个形状要么是带标签元素、标签之间的连接线、行进主体或环境底,且每节屏上词数约 20 个。
### If it doesn't get a word, it doesn't get drawn … Nothing else.
全局 token 集是硬约束:笔画 1.5/2.5/4/7、字号 22/30/42/60/84、圆角 10/22/40(恒为超椭圆 2)、五色五义零装饰,并用 token linter 让构建失败。
Full detail in `reference/design-system.md`. … Gate it with a token linter that fails the build.
构建契约把工程事故写成规则:一节一生成器、共享模块禁并行改、装配前给 SVG defs 命名空间、渲染必须 --workers 1。
**Namespace the SVG defs before assembly.** … Cost in the reference build: 35 seconds of empty screen with every gate green. … `--workers 1` on render. Parallel workers make the video layer paint black.
门禁齐备但明确「门禁不能代替亲眼看」:运动平滑必须在连续帧上验证,且每个门都要拿已知会触发的对照验证其有效性。
**Gates do not replace looking**, and gates that have never failed are not gates. … Motion smoothness is verified on contiguous frames, never on beat frames. … Validate every gate against a control … A seam gate that reports zero on a broken build is worse than no gate.
音频审计到声学层而非转写层:全轨死段扫描、1ms 分辨率包络取证、对成片重跑 ASR 与期望文本比对。
**Audit audio at the acoustic level, not the transcript level.** … truncation cliffs and dead holes, not doubled words.
2核心能力
3外部依赖
| Kind | Dependency / Endpoint |
|---|---|
| cli | FFmpeg(转场窗口连续帧条带抽取,用于读运动缺陷) |
| cli | Node 门禁脚本族(使用者项目内生成的 qa-*.mjs / integrate.mjs,非随包分发)与 HyperFrames CLI |
| package | Python 几何/槽位模块(随包分发,供项目 section builder 导入) |
| package | 兄弟资源:仓库根 docs/STORYTELLING-WORKBOOK.md(中性练习表)与本 skill 的 reference/design-system.md |
4管控建议与判定依据
- scripts/: 执行本地脚本或命令: (本 skill 目录内无可执行入口;两个 .py 是被使用者项目生成器 import 的几何模块)
- 本地工作目录: 文件读写与工件输出: 项目内 compositions/<id>.html(由 scripts/build_<id>.py 生成;要求只改生成器不改产物)
5第二遍独立确认
- [ok] 两个随包 .py 是否真的无网络/无 env/无子进程(蓝档关键) — wall.py 仅 import os, sys 用于路径常量与 DEFS 字符串(os 未用于 environ/exec);geom.py 仅 import math。全目录 grep 无 requests/urllib/socket/http/os.environ/subprocess/eval。结论:几何模块,无执行面。
- [discrepancy] SKILL.md 的门禁脚本是否真属本 skill(避免把项目内产物算作 skill 资产) — [判定:口径澄清,非缺陷]SKILL.md 的命令写作 node scripts/qa-tokens.mjs、node scripts/build_<id>.py、node scripts/integrate.mjs——这些是使用者项目里生成的脚本,pin 仓库的 skill 目录内不存在(该目录仅 5 个文件)。本报告因此在 internal_assets 只列随包文件,并在 external_deps 标注门禁脚本属项目内生成物。
- [unlocatable] 参考实现的具体数字与事故能否在源码内定位 — SKILL.md 引用的大量参考构建细节(最亮像素 101/255、35 秒空屏、输入口 glitch、被听成 stutters 的 20-40ms 接缝、speaker 在屏约 40%)来自作者对一段私有参考构建的返工记录;pin 仓库内没有该构建的渲染/日志/qa 输出,故这些数字只作「文档声明」记录,不在结论中当已核事实。方法本身(规则名与门禁名)可在 SKILL.md 内逐条定位。
- [ok] 「门禁不能替代人眼」是否只是修辞(会不会把 qa 脚本当通过依据) — SKILL.md 明写 'Gates do not replace looking, and gates that have never failed are not gates.',并要求每条门用已知会触发的 control 验证、在装配体而非 section 原型上验证、可读性必须看 960x540 降采样、运动必须读连续帧条带。规则自洽且可执行。
- [ok] 音频纪律是否与「剪辑不碰词」原则冲突 — SKILL.md 要求在句界插入 4–8 帧房间音(words never touched)、用 40ms 等功率交叉淡入接进尾音衰减、且插入式改动对转写是确定性位移(无需重转写)——与语速/词不被裁切的原则一致,属对反例(硬接造成 cliff)的显式修正。
6结论
af02bf58b5fef932…