# Video Producer

> 视频制作全能工具，两种用法——(A) 端到端生产：从零做一支完整视频，出脚本、分镜、机位一致性、素材匹配、闸门、渲染、自检、交付；(B) 给定素材剪辑：已有几个片段要拼一下、给一个片段配音合成、剪辑烧字幕等，直接用 Stage 12 工具箱（assemble/clip-trim/audio-mix/timeline-compose/scene-compose/add-silent-audio/make-outro）。

- Skill: `teamwiseflow/video-producer` (Agent Skill, multi-file: 26 files)
- Install (CLI): `npx skillmds@latest add teamwiseflow/video-producer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/teamwiseflow/video-producer/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: teamwiseflow (https://skillmd.com/u/teamwiseflow)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/teamwiseflow/video-producer

---


# 视频制作与片段修整（video-producer）

## 双模式

本技能有两种用法，agent 据用户请求判断走哪条：

**模式 A：端到端生产**——用户给主题/关键词/已有脚本/已有素材中的任一组合，要求从零做一支完整视频。走 Stage 0→14 全流程：意图路由 → 故事 → 剧本 → 分镜 → 机位 → 素材 → 闸门 → 渲染 → 自检 → 交付。另可接收 **main agent 喂入的 viral-chaser 追爆报告**（作为 brief 的一部分，本技能不做视频下载/转写/抽帧——那是 viral-chaser 的活）。

**模式 B：给定素材剪辑**——不涉及从零开剧本，编辑已有素材，直接用 Stage 12 工具箱（见下方"Stage 12 工具箱"段）：

- 几个片段拼一下 → `assemble`（自动统一分辨率/帧率/音频格式 + 转场）
- 一个片段配个旁白/配音 → `audio-mix`（多轨混音，延时/音量可控）
- 稍微剪一下（入点/出点/倍速）→ `clip-trim`（`--pre-buffer` 避免切 MP3 吞首字）
- 按时间轴切素材+混音 → `timeline-compose`（`audio_mode=concat` 出连续轨）
- 单个 Scene 合成（片段+旁白+对白）→ `scene-compose`
- 无音频片段补静音轨 → `add-silent-audio`
- 片尾制作（形象图+黑边+烧字幕）→ `make-outro`

不适用：

- 纸拼贴 B-roll → `collage-broll`
- Manim 技术演示动画 → `manim-explainer`
- 平面设计 → `design-full`
- 基于已有素材的深度高光剪辑（去口气词/智能剪重点）→ main 的 `video-edit` / `talking-head-cut`（本技能模式 B 只做几何级修整：切段/拼接/混音/烧字幕/补轨，不做语义级剪辑）
- 视频下载与爆款分析 → main 的 `viral-chaser`

---

## 工作区目录约定

调用方传入了现成项目目录时（如平台专家包委托制作，传入 `<platform>/outputs/<video-name>/`，brief 已在其中）直接沿用；否则在 `output_videos/` 下建项目文件夹 `<topic-en-slug>/`：

```
<project-dir>/                  # 即 <platform>/outputs/<video-name>/ 或 output_videos/<topic-en-slug>/
├── brief.md                    # Stage 0/1 产出：意图路由 + 概念选项 + 用户选定
├── reference-driven/           # Stage 1（可选，仅当 main 喂了 viral-chaser 报告）
│   ├── viral-chaser-report.md  # main 喂入的追爆报告原档（本技能不自己跑 viral-chaser）
│   ├── concepts.md             # 据报告出的 2–3 差异化概念 + 成本 + 备选路径
│   └: 无下载产物、无 transcript、无关键帧——那些归 viral-chaser
├── script/
│   ├── intent.json             # Stage 0
│   ├── story.md                # Stage 2
│   ├── script.md               # Stage 3（含 enhancement_cues 六型 + delivery_cues）
│   ├── self-eval.json          # Stage 3 自评
│   ├── decisions.json          # 决策审计链（跨阶段累积）
├── storyboard/
│   ├── storyboard.json         # Stage 4 镜头表
│   ├── shot_decompose.json     # Stage 5 每镜首尾帧+运动+variation_type
├── characters/
│   ├── registry.json           # Stage 6 static/dynamic features
│   ├── <char-id>/front.png     # 三视图（调 siliconflow-img-gen 生成）
│   ├── <char-id>/side.png
│   └── <char-id>/back.png
├── gates/
│   ├── gate-a.md               # GATE A 文本闸门评审产物
│   ├── gate-b.md               # GATE B 素材闸门评审产物
├── slots/
│   ├── slot-plan.json          # Stage 7
│   ├── asset-resolve.json      # Stage 8（含 rejected_picks）
│   ├── slideshow-risk.json     # Stage 9 六维打分
│   ├── delivery-promise.json   # Stage 9 承诺锁定
├── render/
│   ├── shot-NN/                # Stage 10 每镜渲染产物
│   │   ├── first-frame.png     # 首帧静照（生成或素材裁切）
│   │   ├── last-frame.png      # 尾帧静照
│   │   ├── gen-run-v01.mp4     # aigc-video-gen i2v 产物
│   │   └ettings.log
│   │   └ulti-best.mp4          # 多候选择优胜出（多候选时）
├── audio/
│   ├── narration.mp3           # awk-tts 旁白
│   ├── bgm.mp3                 # BGM（bgm-library 免版税曲库优先 / pexels/pixabay / aigc-video-gen music 生成）
│   ├── subtitles.srt           # 字幕
├── artifacts/                  # Stage 12 按镜顺序的最终段
│   ├── 01_*.mp4
│   └ NN_*.mp4
├── video.mp4                   # Stage 12 拼接成片
├── review/                     # Stage 13 公共 video-review 产物
│   ├── verdict.json
│   ├── frames/
│   ├── motion-audit.json       # CP 侧 motion_led 抽查
├── cover.jpg                   # Stage 14 封面
└── final-deliver.md            # Stage 14 交付清单
```

---

## 阶段链（15 段，两闸门）

每段子命令是 `scripts/` 下一个独立 .py，agent 按本 SKILL.md 工作流逐个调。**产物文件存在性即 checkpoint**——每个子命令先查产物文件是否存在，存在则 load 不重生成（允许用户手改 JSON 后续跑）。

```
Stage 0  intent-router        意图路由 → 三档脚本模板（故事讲述型/纯画面动效型/蒙太奇剪接型）
  · 故事讲述型（narrative）——重情节、有人物弧光、含旁白；默认 3–5 镜/场
  · 纯画面动效型（motion）——重节奏感/视觉冲击/少对白；默认 5–8 镜快切
  · 蒙太奇剪接型（montage）——重氛围/抽象/纯视觉；默认 4–7 镜无叙事
Stage 1  reference-concepts   若 main 喂了 viral-chaser 报告 → 吃报告出 2–3 差异化概念；无报告跳过
Stage 2  story-develop        idea → 故事（含受众/类型显式复述，100–200 词梗概，人物，分场）
Stage 3  script-write         故事 → 分场剧本（同时间同地点分一场；可拍化描述；enhancer 润色）
Stage 3b script-self-eval     脚本自评 N 维打分，任一维 <3 必返工
Stage 4  storyboard-build     剧本 → 镜头表（每镜叙事目的/机位复用/位置朝向/不写不可见）
Stage 5  shot-decompose       每镜拆首帧静照/尾帧静照/运动描述（variation_type 三档）
Stage 6  character-register   角色三视图 front/side/back + static/dynamic features 拆分
   ────── GATE A：文本闸门（脚本+分镜+机位+角色全齐，停，发用户审）──────
Stage 7  slot-plan            素材 slot 规划（template + hero slot + tone→slot 数）
Stage 8  asset-resolve        按 slot 拉素材（Fast path：多源并发搜 + 缩略图人核 + rejected_picks 落盘）
Stage 9a slideshow-risk       六维幻灯风险打分（pre-compose 闸门，≥4.0 fail 不许进 compose）
Stage 9b delivery-promise-lock 交付承诺八类锁定 + motion_ratio 预估
   ────── GATE B：素材闸门（素材齐+计划过审，停，发用户看 contact sheet）──────
Stage 10 render-shot          按 slot 渲染（AIGC 走 aigc-video-gen i2v 首尾帧插值；静图走 siliconflow-img-gen）
Stage 11 mix-audio            配音配乐四场景分流（A 人物对话声画同出 / B 旁白一次性 TTS 带字级时间戳 + 对齐 / C BGM 成片后统一生成（优先 bgm-library 免版税曲库，pexels/pixabay 并列；定制风格用 aigc-video-gen music）/ D 用户口播录音 → ASR 时间戳 → 按时间戳补素材）
Stage 12 assemble             按序拼接成片（原子工具箱：clip-trim 切段 / audio-mix 混音 / timeline-compose 时间轴合成 / assemble 拼接，agent 按 §Stage 12 工具箱场景化组合，不写死 Workflow）
Stage 13a video-review        公共 video-review 技术自检（强制闸门）
Stage 13b motion-audit       CP 侧 motion_led 抽查（兑付 delivery-promise）
Stage 14a make-cover          封面（siliconflow-img-gen，必含标题文字）
Stage 14b 交付                 向用户呈交成片+封面+关键参数
```

> Stage 0–6 全是**文本产物**，付费生成前必停——GATE A 落在这条边界上。GATE B 落在素材就绪、pre-compose 闸门通过后，确认渲染前最终计划。

---

## 子命令调用清单

| 子命令 | 入 | 出 | 用途 |
|--------|----|----|------|
| `intent-router` | brief.md（主题/关键词，或 viral-chaser 报告） | `script/intent.json`（档位+主题） | Stage 0 |
| `reference-concepts` | viral-chaser 报告（main 喂入，可选） | `reference-driven/concepts.md` | Stage 1：只吃报告出概念，不做下载/转写/抽帧；无报告跳过 |
| `story-develop` | intent.json | `script/story.md` | Stage 2 |
| `script-write` | story.md | `script/script.md`（含 enhancement_cues + delivery_cues） | Stage 3 |
| `script-self-eval` | script.md | `script/self-eval.json`（N 维分，任一维 <3 必返工） | Stage 3b |
| `storyboard-build` | script.md | `storyboard/storyboard.json` | Stage 4 |
| `shot-decompose` | storyboard.json | `storyboard/shot_decompose.json`（每镜首尾帧+运动+variation_type） | Stage 5 |
| `character-register` | storyboard.json + 人物描述 | `characters/registry.json` + 三视图 PNG | Stage 6（三视图调 siliconflow-img-gen） |
| `slot-plan` | storyboard.json + tone | `slots/slot-plan.json` | Stage 7 |
| `asset-resolve` | slot-plan.json | `slots/asset-resolve.json`（含 rejected_picks）+ 素材落 `raw_materials/` | Stage 8（调 pexels-footage / pixabay-footage / aigc-video-gen） |
| `slideshow-risk` | storyboard.json + slot-plan.json + asset-resolve.json | `slots/slideshow-risk.json`（六维分） | Stage 9a |
| `delivery-promise-lock` | storyboard.json + brief.md | `slots/delivery-promise.json`（八类锁） | Stage 9b |
| `render-shot` | shot_decompose.json + characters/ + slot-picks | `render/shot-NN/` 下产物 | Stage 10（调 aigc-video-gen i2v / siliconflow-img-gen） |
| `mix-audio` | script.md（delivery_cues） | `audio/` 目录 + `subtitles.srt` 模板 | Stage 11（四场景分流：A 声画同出 / B 旁白一次性 TTS+ASR 对齐 / C BGM 成片后生成（优先 bgm-library 免版税曲库 / pexels/pixabay 并列；定制风格用 aigc-video-gen music）/ D 用户口播录音 → ASR 时间戳 → 按时间戳补素材） |
| `narration-align` | audio/narration.mp3 + audio/narration.subtitle.json | `audio/narration-segments.json`（统一 segments 格式） | Stage 11b（优先复用 awk-tts --enable-subtitle 落盘的 TTS 原生字级时间戳，缺失时回退火山 ASR 极速版，凭据复用 viral-chaser 同池 `VOLC_ASR_*`） |
| `assemble` | render/ 顺序 | `video.mp4` | Stage 12（按序拼接 + 可选转场 + 可选分辨率归一化 + 自动补静音/统一音频格式） |
| `add-silent-audio` | 无音频视频片段 | 含静音音轨的视频 | Stage 12 原子工具：concat 前补齐音轨，保持连续 |
| `clip-trim` | 素材路径 + 入点/出点/倍速 | 切好的片段 | Stage 12 原子工具：精确切素材，视频和音频分别处理 |
| `audio-mix` | 多条音轨 + 各自延时/音量 | 混合音频 | Stage 12 原子工具：多轨混音 |
| `timeline-compose` | timeline.json（每段素材/入点/出点/倍速/音轨及延时） | 合成片段 | Stage 12 原子工具：按时间轴调 clip-trim + audio-mix 合成 |
| `motion-audit` | video.mp4 + delivery-promise.json | `review/motion-audit.json`（motion_led 抽查） | Stage 13b（补公共 video-review） |
| `make-cover` | brief.md（标题）+ storyboard 关键帧 | `cover.jpg` | Stage 14a（调 siliconflow-img-gen） |

> wrapper `video-producer.sh` 内部 `exec python3 "$SCRIPT_DIR/scripts/<子命令>.py" "$@"`——子命令名即脚本名，零路径拼接。

---

## 强制闸门与护栏

### GATE A（Stage 6 后）：文本闸门

文本产物全齐（脚本+分镜+机位+角色），**停下发用户审**：

- 呈交摘要：档位、场次数、镜数、角色数、关键决策（路径/模型/风格选择的备选+置信度+理由）
- **结束本轮回复**，不许在同条回复里进 Stage 7
- 批准是**逐闸门的**——早先的一句"你继续"不覆盖本闸门
- 用户要改哪段就重跑对应子命令（产物文件存在性即 checkpoint，不会重生成未改的）

### GATE B（Stage 9 后）：素材闸门

素材齐 + 计划过 slideshow_risk + delivery_promise 锁，**停下发用户看 contact sheet**：

- 呈交：slot 总数、素材就绪率、slideshow_risk 六维分与 verdict、delivery_promise 八类与 motion_ratio 预估、素材 contact sheet
- 同 GATE A 收尾纪律

### 返工与耗时上限

- 每阶段最多返工 **3 次**
- 全片最多 **3 次** send-back
- 每阶段 wall-time 默认上限 **20 分钟**——卡住要报，不要反复撞

### 不许声称没做过的事

没有 tool result 或产物文件证明，不许声称已渲染/已生成/已改动。

### 模糊意图不算确认

- 用户说"做个短片""帮我策划"**不算确认**，必须先问清楚走哪条 workflow（故事讲述型/纯画面动效型/蒙太奇剪接型）、时长、受众
- 起草/讨论脚本属对话协助，**不许调 render 工具**
- 默认**小规模**：1 场 3–5 镜，不许把模糊想法擅自扩成多场多镜；用户要扩才扩

### 决策审计链

每个选择（路径/模型/风格/音色/任何 fallback）记 `备选 + 置信度 + 理由`，跨阶段累积进 `script/decisions.json`。

---

## 依赖

| 依赖 | 来源 | 用在哪 |
|------|------|------|
| python3 / ffmpeg / ffprobe | 系统 | 各阶段脚本 |
| 公共 `aigc-video-gen` | skills/ | Stage 8/10 视频片段生成（百炼/火山声画同出，i2v 首尾帧插值） |
| 公共 `siliconflow-img-gen` | skills/ | Stage 6 角色三视图 / Stage 10 静帧 / Stage 14 封面 |
| 公共 `awk-tts` | skills/ | Stage 11B 旁白一次性 TTS（OpenClaw 内置 TTS 优先 → awk-tts fallback；加 `--enable-subtitle` 让火山单向流式 HTTP 原生返回字级时间戳，落 `narration.subtitle.json`） |
| 火山 ASR 凭据 `VOLC_ASR_*` | 实例 env | Stage 11b narration-align 回退路径 + Stage 11D 用户口播录音转写拿时间戳（复用 viral-chaser 同池：旧控制台双头 `VOLC_ASR_APP_ID`+`VOLC_ASR_ACCESS_KEY`，或新控制台单头 `VOLC_ASR_APP_KEY`） |
| 公共 `pexels-footage` / `pixabay-footage` | skills/ | Stage 8 Stock Footage 素材补充 / Stage 11C BGM 搜 |
| 公共 `bgm-library` | skills/ | Stage 11C BGM 搜（ccMixter 免版税 + 自动 TASL 署名，免 key，商用安全；与 pexels/pixabay 并列，优先用） |
| 公共 `video-review` | skills/ | Stage 13a 成片技术自检闸门 |
| `requests` | 仓根 requirements.txt | 各脚本 HTTP 调用 |

---

## 子命令清单（wrapper 视角）

| 子命令 | 用途 | 退出码 |
|--------|------|--------|
| `video-producer intent-router` | 意图路由三档 | 0 成功 / 1 参数错 / 2 env 未配 |
| `video-producer reference-concepts` | 吃 viral-chaser 报告出概念 | 0 成功 / 1 参数错 |
| `video-producer story-develop` | idea → 故事 | 0 成功 / 1 参数错 |
| `video-producer script-write` | 故事 → 分场剧本 | 0 成功 / 1 参数错 |
| `video-producer script-self-eval` | 脚本自评 N 维 | 0 成功 / 1 参数错 |
| `video-producer storyboard-build` | 剧本 → 镜头表 | 0 成功 / 1 参数错 |
| `video-producer shot-decompose` | 每镜拆首尾帧+运动 | 0 成功 / 1 参数错 |
| `video-producer character-register` | 角色三视图 + features | 0 成功 / 1 参数错 |
| `video-producer slot-plan` | 素材 slot 规划 | 0 成功 / 1 参数错 |
| `video-producer asset-resolve` | 按 slot 拉素材 | 0 成功 / 1 参数错 / 2 env 未配 |
| `video-producer slideshow-risk` | 六维幻灯风险打分 | 0 成功 / 1 参数错 |
| `video-producer delivery-promise-lock` | 八类承诺锁定 | 0 成功 / 1 参数错 |
| `video-producer render-shot` | 按 slot 渲染 | 0 成功 / 1 参数错 / 2 env 未配 |
| `video-producer mix-audio` | 三场景分流占位 | 0 成功 / 1 参数错 |
| `video-producer narration-align` | 旁白 ASR 对齐时间戳 | 0 成功 / 1 参数错 / 2 env 未配 |
| `video-producer assemble` | 按序拼接成片 | 0 成功 / 1 参数错 |
| `video-producer add-silent-audio` | 给无音频视频补静音轨 | 0 成功 / 1 参数错 |
| `video-producer scene-compose` | 单 Scene 分段合成 | 0 成功 / 1 参数错 |
| `video-producer make-outro` | 片尾制作 | 0 成功 / 1 参数错 |
| `video-producer clip-trim` | 切素材段 | 0 成功 / 1 参数错 |
| `video-producer audio-mix` | 多轨混音 | 0 成功 / 1 参数错 |
| `video-producer timeline-compose` | 时间轴合成 | 0 成功 / 1 参数错 |
| `video-producer motion-audit` | motion_led 抽查 | 0 成功 / 1 参数错 |
| `video-producer make-cover` | 封面（必含标题） | 0 成功 / 1 参数错 / 2 env 未配 |

---

## Stage 12 工具箱（场景化组合，不写死 Workflow）

Stage 12 段**不规定固定 Workflow**——下面四个原子工具 agent 按实际场景灵活组合。

### 原子工具清单

| 工具 | 干什么 | 关键参数 |
|------|--------|---------|
| `clip-trim` | 精确切素材段（入点/出点/倍速/前置缓冲，视频和音频分别处理） | `--input/--output/--start/--end/--speed/--sync-audio/--pre-buffer` |
| `audio-mix` | 多轨混音（每轨独立延时和音量） | `--track（可重复）/--delay/--volume/--output/--duration` |
| `timeline-compose` | 按时间轴 JSON 调 clip-trim + audio-mix 合成片段 | `<project_dir> --timeline timeline.json [--transition ...]` |
| `assemble` | 按序拼接已就绪的段 + 可选转场 + 自动分辨率归一化 + 自动统一音频格式 | `<project_dir> [--transition hard/fade/dissolve/xfade] [--width 1080] [--fps 30] [--audio-format 24000/mono] [--low-memory] [--preview-duration 30]` |
| `add-silent-audio` | 给无音频视频片段补静音音轨（concat 前置，assemble 内部也自动调） | `--input/--output/--duration/--sample-rate 24000/--channels mono` |
| `scene-compose` | 单 Scene 分段合成（片段+旁白+对白 → 一个 Scene 片段） | `<project_dir> --scene scene.json [--output scene-01.mp4]` |
| `make-outro` | 片尾制作（形象图+黑边+烧字幕+静音轨 → 标准比例片尾） | `<project_dir> --image <形象图> --slogan <文本> [--color color.json] [--duration 5] [--width 1080] [--fps 30]` |

### 场景化组合示例（非强制，agent 按实际判断）

**场景 A：无旁白直拼**
段就绪、无需切素材、无需混音——`assemble <project_dir> --transition fade` 一把过。

**场景 B：有旁白走时间轴**
旁白一次性 TTS 生成 + narration-align 拿字级时间戳后，按时间戳把各段素材对齐旁白：
1. agent 据 narration-segments.json 各段 start/end 冡素材入点/出点，写 timeline.json
2. `timeline-compose <project_dir> --timeline timeline.json` → 调 clip-trim 切段 + audio-mix 把旁白按延时叠到各段
3. 全段 BGM 走 timeline.json 的 `audio_globals` 字段混入

**场景 C：分段先合再合（scene-compose 两阶段）**
长片或某些段需独立预合（如先合 shot-01~03 为一场 Scene，再合 shot-04~06 为另一场，最后两场 concat）：
1. 写 `scene-01.json`（clips 片段列表 + narration 旁白 + dialogue 对白），跑 `scene-compose <project_dir> --scene scene-01.json --output scene-01.mp4`
2. 同样出 `scene-02.mp4`
3. 把 scene-01.mp4 / scene-02.mp4 当段素材，再跑 `assemble <project_dir> --source-dir scenes --transition fade` 合片
scene-compose 内部调 clip-trim 切段 + audio-mix 混旁白/对白 + assemble 拼段，一步出单 Scene 完整片段。

**场景 D：素材尺寸不一**
AIGC 720x1280、录屏 1080x2384、片尾 784x1176 混拼——`assemble` 传 `--width 1080 --fps 30` 归一化（scale + pad 16:9 + sar + fps 统一）后再 concat。

**场景 E：精确调速某段**
某段需 2x 快放——`clip-trim --input <段> --output <快放段> --speed 2 --sync-audio` 切好后，把快放段当段素材再拼。

**场景 F：低内存机器**
机器内存吃紧（< 4G 或容器限额）——`assemble <project_dir> --transition fade --low-memory`，preset 切 ultrafast、crf 放宽到 28，避免 x264 缓冲爆内存。打印里会标注 `低内存模式：preset=ultrafast, crf=28`。

**场景 G：先试听再合成**
长片合成前想先听前 30 秒验证旁白/BGM 平衡——`assemble <project_dir> --preview-duration 30`，成片照常落，额外产 `video-preview.mp4`（前 30 秒，`-c copy` 秒切）。试听满意后再决定是否重混。

**场景 H：AIGC 无音频段混拼 + 旁白切段吞首字**
AIGC i2v 产物常无音频流，与有音频段直拼会断续；旁白用 `clip-trim --ss` 切 MP3 会吞第一个字。`assemble` 现在自动统一音频格式（默认 24000/mono，无音频段补静音，规格不符段重采样）+ 不传 `--width/--fps` 时自动探测各段分辨率/帧率、不一时统一到最低公共规格。旁白切段走 `clip-trim --pre-buffer 0.5`，实际入点提前 0.5s 保留段头音频，逻辑入点不变。

agent 据剧本实际选场景组合，可混合多场景（如 B+E：旁白时间轴 + 某段快放）。脚本不预设顺序。

---

## 禁止事项（强制）

- **禁止跳过 GATE A/B 交付**：两闸门是工作流的一部分，呈交摘要后必须结束本轮回复等用户批
- **禁止声称没做过的事**：没有 tool result 或产物文件证明，不许声称已渲染/已生成/已改动
- **禁止把模糊想法擅自扩成多场多镜**：默认 1 场 3–5 镜，用户要扩才扩
- **禁止跳过 video-review 交付**：Stage 13a 强制闸门，verdict=pass 才进 Stage 14
- **禁止直接写 ffmpeg 命令**：所有 ffmpeg 调用走本技能子命令脚本或公共 video-edit 子命令
- **禁止自己做视频下载/转写/抽帧**：那是 viral-chaser 的活，本技能只吃 main 喂入的报告
- **禁止引入 CLIP / torch 系本地模型**：素材匹配走 Fast path 人核缩略图
- **禁止扩充图库源**：保 Pexels + Pixabay 两源
- **禁止批量生成**：逐条精做，不批量撞运气

