1实现原理 · 为什么它能做到
首要规则是「先可信、后动效」:克制被读成可信,过度动画被读成广告。
A testimonial earns its job by feeling *real*, not produced. Restraint reads as credibility; over-animation reads as an ad people skip.
逐行/逐句按阅读顺序揭示,全部由帧推导,禁止 CSS transition 与 JS 计时器。
drive every line off `useCurrentFrame()` so it renders deterministically — never a CSS transition or a JS timer, which desync from the frame renderer.
重点短语只允许一处,且在所属行稳定之后才落(高亮 sweep / 字重 / 变色)。
let it arrive *after* its line has settled
分数星级用两层字形按宽度裁切:4.5 与 5.0 一样精确,不需要半星素材。
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.
作者块最后签收并保持静止;头像必须真实,否则干脆不用。
Use a real avatar or none — a generic placeholder face actively destroys trust.
数据完整性:highlight 必须是引文的逐字子串,否则直接挡下渲染。
The `highlight ⊂ quote` check is the important one: it guarantees you only ever emphasize words the customer actually wrote.
评分正确性与无障碍同源:绝不显示数据不支持的空心/实心星,也绝不为无评分的评价补分。
never show more filled stars than the data supports
模板 × 评论列表 → 一评一条视频;视觉全在单一 theme 对象里。
The payoff: make every field a prop, hardcode nothing, then render once per review.
验证环:按「引文→星级→作者」顺序各采一帧,且用 shipped review 的 props。
**Verify loop — render stills → inspect → encode.** Cheap PNGs first; render with the **shipped** review's props, not just `defaultProps`.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| 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 参数;仅读者点击才请求) |
4风险提醒 风险提醒:橙色 · 评估后使用
- 批量脚本有可运行性缺陷 — slug 在 TDZ 中被调用,照抄即报错;使用者需自行修正才能跑通批量。
- 远程包与本地代码执行 — npx 取回 remotion/csv-parse 并执行;Remotion 渲染会在本地无头 Chromium 内运行项目代码。
- 评论内容不做真伪审核 — quote/name/company 原样上屏,skill 只校验结构;伪造评价在技术上不会被拦下(但文档有明确的反伪造价值观)。
- 远程头像 URL 会成为渲染期请求 — avatar 允许任意 URL,渲染器会去拉取;来源与隐私由使用者自负(skill 未限制域名)。
- 商业引流位 — reference 尾部固定 iart.ai 推广段与 utm 链接。
5第二遍独立确认
- [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。
6结论
e005b1884e39df9a…0de0f2a1c1