testimonial-video
This skill should be used when the user asks to "make an animated testimonial", "create a quote video", "build a review video", "turn a customer testimonial into a graphic", "animate a customer review", "make a social proof video", "add an animated star rating", or "turn a list of reviews into videos". Covers quote typography, staggered line reveals, kinetic emphasis on key phrases, animated star ratings, the author block (name/role/avatar/company), and templating one card across many quotes.
1How It Works & Mechanism
The primary rule is "credibility first, motion second": restraint conveys credibility, while excessive animation reads as an ad.
A testimonial earns its job by feeling *real*, not produced. Restraint reads as credibility; over-animation reads as an ad people skip.
Line-by-line / clause-by-clause reveal following reading order, entirely frame-driven, strictly prohibiting CSS transitions and JS timers.
drive every line off `useCurrentFrame()` so it renders deterministically — never a CSS transition or a JS timer, which desync from the frame renderer.
Only a single key phrase emphasis is allowed, appearing only after its containing line has settled (highlight sweep / font weight / color shift).
let it arrive *after* its line has settled
Fractional star ratings use two layered glyphs cropped by width: 4.5 is just as accurate as 5.0, without needing half-star assets.
Use one full row of star glyphs as a mask, then wipe a filled layer to `rating / max` width — this handles 4.5 as cleanly as 5.0, with no half-star sprite.
The author block signs off last and remains static; avatars must be authentic, or omitted entirely.
Use a real avatar or none — a generic placeholder face actively destroys trust.
Data integrity: highlight must be a verbatim substring of the quote, otherwise rendering is blocked immediately.
The `highlight ⊂ quote` check is the important one: it guarantees you only ever emphasize words the customer actually wrote.
Rating accuracy and accessibility share the same root: never display empty/filled stars unsupported by data, and never invent ratings for reviews without them.
never show more filled stars than the data supports
Template × review list → one video per review; all visual styling is encapsulated in a single theme object.
The payoff: make every field a prop, hardcode nothing, then render once per review.
Validation loop: capture one frame each following the sequence "quote → star rating → author", using props from a shipped review.
**Verify loop — render stills → inspect → encode.** Cheap PNGs first; render with the **shipped** review's props, not just `defaultProps`.
2Core Capabilities
3External Dependencies
| Kind | Dependency / Endpoint |
|---|---|
| package | remotion(frame/spring/interpolate/Img) |
| package | csv-parse(reviews.csv → props) |
| cli | npx remotion render(逐条评论渲染 MP4) |
| cli | ffmpeg / ffprobe(仓库共享 contact-sheet.sh、probe-mp4.sh) |
| network | iart.ai(reference 尾部推广链接,具 utm 参数;仅读者点击才请求) |
4Recommended Governance & Evidence
- scripts/: Execute local scripts or commands: No bundled scripts in skill directory; SKILL.md/reference instructs agent to run `node` (CSV→props script, source code in refer
- 网络端点: Declare external network access: No operational API calls during runtime; review text and avatar assets provided by user (local files or user-provided URLs).
- 本地工作目录: File read/write & artifact output: Writes `reviews/*.json` (CSV→props artifacts), `out/*.mp4`, and `out/demo.gif` inside user workspace.
5Second-Pass Verification
- [discrepancy] 批量脚本是否可直接运行 — batch-and-typography.md 的 `rows.forEach(...)` 内部调用 `slug(r.name)`,而 `const slug = ...` 定义在 forEach **之后**——直接运行会触发 TDZ ReferenceError(应把 slug 定义提前)。这是照抄会失败的实现瑕疵。
- [ok] 星级/分值口径是否两处一致 — SKILL.md 的 StarRating 与 quote-card.md 都用 `(rating/max)*100` 宽度裁切,都挂 role=img + aria-label 真实分值;BT 另补充「无评分就不画星,不默认 5 星」。
- [ok] 时序表与公式是否自洽 — quote-card 的时序表(8–48 行、44–54 高亮…)对应 `hlStart = 8 + lines.length * 6 + 4`:5 行时 hlStart=42(表列 44),6 行时 48(表列 44–54 上沿)——量级一致,表以 5–6 行引文为例。
- [ok] SKILL.md 与 reference 的 schema 是否同构 — quote/highlight/rating/max/name/role/company/avatar 八个字段在 SKILL.md 示例、quote-card.md 的 Review 类型、BT 的 Review 类型三处完全一致。
- [ok] 顺序纪律是否有一致论证 — 本 skill 的顺序是「引文→星→作者」(claim → proof → who);SKILL.md 与 quote-card.md 的 Why these choices 均说明重排会削弱可信度。
- [ok] 凭证/外发面反查 — token 扫描零实质命中;无 env、无 keychain、无 cookie 读取;批量脚本只读本地 CSV、只写本地 JSON 与 MP4。
6Verdict & Scenarios
e005b1884e39df9a…