motion-graphics
A short, design-led motion graphic where motion is the message — kinetic typography, stat count-up, chart/data-viz hit, logo sting / brand lockup, lower-third / callout / social overlay, animated map (highlight regions, connect places, zoom to a location), animated tweet / news-article / headline, webpage / UI animation (scroll, cursor, callouts), or fusing a real image's geometry into a chart. Usually under 10s (up to ~30s), no narration or live-action subject; renders to MP4 or transparent overlay. Longer / narrated / multi-scene → /general-video. Unclear → /hyperframes.
1How It Works & Mechanism
The design orientation focuses on 'design-led motion graphics' (motion is the message), setting the pipeline to autonomous mode: at most one clarifying question (Director Part 1), followed by uninterrupted execution through building and verification without intermediate review gates; only rendering remains user-gated.
This workflow is **autonomous by design** — at most one clarifying question (`agents/director.md`), then build through verification without intermediate review.
Asset-first approach: Determine the asset strategy and retrieve real materials first, design shots around available assets, and finally assemble using catalog capabilities; pure code/text categories skip the sourcing step entirely.
**Asset-first**: decide the asset strategy and source real material _before_ designing the shot, then design the shot around what you have, then compose by reusing catalog capabilities.
Taxonomy branches based on whether search is needed: format-driven categories (kinetic-type / stat / charts / logo-reveal / lower-thirds / maps) use user-provided content; search-driven categories (webpage / news / tweet / asset-fusion) search first and decide animation style based on returned content.
`plan`'s **first decision is: does this need a search?** That fork splits the categories into two groups; then the specific category is picked — for search-driven, **by the type of content the search returns**.
Building follows 'reuse-first': Run `npx hyperframes add <block>` to fetch catalog blocks and modify them in place; only functional gaps and asset-fusion expressions are written from scratch.
**Reuse-first**: `npx hyperframes add <block>` + customize in place; hand-author only gaps + the asset-fusion affordance. Output `compositions/index.html` honoring the HF contract (paused GSAP timeline on `window.__timelines`, `class="clip"` + stable ids, `tl.seek(0)`, deterministic).
Coordinates are resolved via the locate protocol rather than model estimation: discrete grid-strip selection is used (far more reliable than direct pixel regression), reserving the one-call auto path only when a strong detector key exists in the environment.
Author models are unreliable at **regressing pixel coordinates** on a cluttered full image (measured: weak vision models ~16–24% center error → rings land off-target) but reliable at **picking a numbered strip** (~3–4% with the loop below). So: never eyeball coordinates; localize by discrete choice.
Base maps for map categories must be baked into MP4 inside headless Chrome: not for smoothness, but because Hyperframes forbids runtime network calls and mandates deterministic output—live tiles shift across renders.
// Why bake the imagery at all (this is the real reason, not "smoothness"): HF forbids render-time // network and requires deterministic output. Live raster tiles re-fetch every render and can change // → non-deterministic. Baking FREEZES the imagery into pixels = deterministic + offline-reproducible.
Verification requires selecting three proof frames—opening state, hero action, and final hold—for human contact sheet review; failures trigger only one in-place fix (finalize subagent), strictly prohibiting duration adjustments to mask flaws.
Choose proof times that show the opening state, signature move, and final hold. Inspect the generated contact or snapshot sheet before continuing. On `lint`, `check`, or snapshot failure, dispatch the repair subagent (`agents/finalize.md`) for one in-place fix pass, then rerun the failed gate. Never change a fixed duration merely to hide a defect.
2Core Capabilities
3External Dependencies
| Kind | Dependency / Endpoint |
|---|---|
| cli | hyperframes CLI(init / doctor / add / lint / check / snapshot / preview / render / skills update) |
| cli | ffmpeg / ffprobe(探帧率与时长、抽帧、编码) |
| api | Google Generative Language API(可选的视觉检测快路径,仅在环境存在 key 时使用) |
| api | 可选图像生成 key(media-use resolve 的生成分支;未设置则只搜索或不生成) |
| network | 底图瓦片与矢量数据(仅在 maps 分类烘焙底图时联网;烘焙后离线可复现) |
| package | puppeteer-core + 无头 Chrome(底图烘焙录制) |
| network | GSAP CDN(示例资产 _ref-circle-highlight.html 引用) |
| package | 兄弟 skill 依赖(/media-use 的 resolve 与 search 提供者、/hyperframes-animation 的 rules/blueprints、/hyperframes-core 的 brief-contract、/figma) |
4Recommended Governance & Evidence
- scripts/: Local script and command execution: node grounding/locate.mjs overlay|region|final|mark|auto <img> ... (ffmpeg/ffprobe)
- 网络端点: Declared external network access: https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent
- 本地工作目录: File I/O and artifact generation: videos/<project>/hyperframes.json, context.log, shot-plan.json (IR), composition.html
5Second-Pass Verification
- [ok] GEMINI_API_KEY 是否真的被读取并外发(橙档判定的关键证据) — locate.mjs:192 `const key = process.env.GEMINI_API_KEY;`;紧接着 key 缺失即报错退出('auto needs GEMINI_API_KEY; use the grid loop instead (overlay→region→final→mark)');存在时把 base64 图像与目标描述 POST 到 generativelanguage.googleapis.com(`?key=${key}`)。调用点真实存在,且仅在 `auto` 子命令触发。
- [ok] 『不假设有检测器』的守卫是否真的生效(避免第一遍误判为『总是联网』) — PROTOCOL.md 明写 '**Never assume the key exists.** No key → path 2.',且把网格循环列为『the normal case』;SKILL.md 的可选键表也把 GEMINI_API_KEY 标为 optional 并给出 fallback(skip generate / search-only)。因此网络外发是有条件、可预期的,而非默认路径。
- [discrepancy] Step 2 引用的 resolve.mjs 是否随包分发 — SKILL.md Step 2 给出 `(cd "$PROJECT_DIR" && node <SKILL_DIR>/phases/source/resolve.mjs --plan ./shot-plan.json --out ./assets)`,但 **phases/source/ 下只有 guide.md,没有 resolve.mjs**(全量文件清单已确认)。guide.md 末尾也标了 '> Illustrative: … — or drive media-use's `resolve` procedure directly.'。结论:该命令是示意而非可执行入口,实际取材须由 /media-use 的 resolve 流程驱动;SKILL.md 自身有 'illustrative' 标注,故不算虚假声明,但读者若照抄命令会直接失败——这是对 pin commit 有效的真实出入。
- [ok] 底图烘焙是否真是本地行为而非渲染期联网 — bake-basemap.mjs 头注释与实现一致:在无头 Chrome 内加载 MapLibre + 瓦片,录帧到 frames-<NAME>/,导出 coords.json;SKILL.md 只在该分类下引用它。渲染期(hyperframes render)不触发任何取瓦片行为,符合 HF 的『渲染期禁网』契约——这也是文档给出的烘焙理由,自洽。
- [ok] 『外部资源』逐条回查调用点 — hyperframes init/doctor/add/lint/check/snapshot/preview/render 均在 SKILL.md 出现;ffmpeg/ffprobe 在 locate.mjs 与 bake-basemap.mjs 的 execFileSync/spawnSync 可验;瓦片 URL 与 CDN 在 bake-basemap.mjs:106-119 与 :153 原文;gsap CDN 在 samples HTML 原文;media-use resolve 在 guide.md 原文。
- [unlocatable] 验证:视觉定位协议的准确率声明是否可在源码内定位 — PROTOCOL.md 给出的误差数字(弱模型 16–24%、网格循环 3–4%、'eyeballing 6.5% → this protocol 2.3%')引用的是一项测量结论,源码内无复现脚本或数据文件;本次为只读侦查且不得运行构建/渲染,故不验证这些数值,仅作为『文档声明』记录,不在结论中当作已核事实使用。
6Verdict & Scenarios
7966ceeccd29cbdd…