Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions .agent/skills/science-video-pipeline/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
---
name: science-video-pipeline
description: 把论文/综述做成动效图解科普视频的九阶段流水线(论文精读提取→策划→逐字稿 SSOT→双重校验→分镜→TTS 声音克隆→Remotion 场景实现→草渲抽帧 QA→终渲交付)。Use when producing or iterating a media/*-video/ episode: narration.md, storyboard.md, IndexTTS voice cloning, Remotion scenes, frame QA, or final render; or when scaffolding a new episode.
description: 把论文/综述做成动效图解科普视频的九阶段流水线(论文精读提取→策划→逐字稿 SSOT→双重校验→分镜→TTS 声音克隆→Remotion 场景实现→草渲抽帧 QA→终渲交付)。Use when producing or iterating an apps/negentropy-influence/episodes/*-video/ episode: narration.md, storyboard.md, IndexTTS voice cloning, Remotion scenes, frame QA, or final render; or when scaffolding a new episode.
allowed-tools: Read, Write, Edit, Glob, Grep, Bash
---

# 科普视频制作流水线(导航壳)

本 Skill 是路由层:内容 SSOT 在 `media/pipeline/skills/01–09.md`,工具 SSOT 在
`media/pipeline/scripts/`,不在此复制任何正文(防第二事实源)。
本 Skill 是路由层:内容 SSOT 在 `apps/negentropy-influence/pipeline/skills/01–09.md`,工具 SSOT 在
`apps/negentropy-influence/pipeline/scripts/`,不在此复制任何正文(防第二事实源)。

## 九阶段速查

| Stage | 做什么 | 规格链接 | 工具/命令(编排入口 `pipeline.py`) | 通过门 |
|---|---|---|---|---|
| ① 信源精读取证 | **A 型论文**:并行子代理逐章 + 官方站点补充;**B 型文档/代码/课程站点**:固定提交取证 + 证据三级 | [01](../../../media/pipeline/skills/01-source-extraction.md) | A 型 `paper_extract.py`(map/text/captions/find/render);B 型 `source_ledger.py`(fetch/list/verify) | 全部断言可回溯;RISKY=0 |
| ② 策划 | 受众/结构/视觉契约(色彩语义) | [02](../../../media/pipeline/skills/02-planning.md) | — | planning.md 六节齐 |
| ③ 逐字稿 | narration.md ★单一事实源 | [03](../../../media/pipeline/skills/03-narration.md) | `pipeline.py build` | `build_narration.py` 通过 |
| ④⑤ 双重校验 + 分镜 | 真实性回溯 + 易懂性;beat 覆盖性 | [04](../../../media/pipeline/skills/04-verification.md) / [05](../../../media/pipeline/skills/05-storyboard.md) | `pipeline.py check`(+`--check-scenes`) | RISKY=0;覆盖率无缺句 |
| ⑥ TTS 配音 | 本人音色克隆(IndexTTS-2.5) | [07](../../../media/pipeline/skills/07-tts-voice.md) | `pipeline.py tts --plan` | refs 指纹门 + 试听 + ETA |
| ⑦ Remotion 场景 | 代码动画实现 | [06](../../../media/pipeline/skills/06-remotion-implementation.md) | `tsc --noEmit` | 七条渲染红线 |
| ⑧ 草渲 + 抽帧 QA | 半分辨率快速迭代 | [08](../../../media/pipeline/skills/08-render-qa.md) | `pipeline.py render` + `qa` | 自动体检零 FAIL |
| ⑨ 终渲 + 交付 | 1080p30 + srt/vtt | [09](../../../media/pipeline/skills/09-final-render.md) | `render --final` + `captions` | 实测时长在预算窗 |
| ① 信源精读取证 | **A 型论文**:并行子代理逐章 + 官方站点补充;**B 型文档/代码/课程站点**:固定提交取证 + 证据三级 | [01](../../../apps/negentropy-influence/pipeline/skills/01-source-extraction.md) | A 型 `paper_extract.py`(map/text/captions/find/render);B 型 `source_ledger.py`(fetch/list/verify) | 全部断言可回溯;RISKY=0 |
| ② 策划 | 受众/结构/视觉契约(色彩语义) | [02](../../../apps/negentropy-influence/pipeline/skills/02-planning.md) | — | planning.md 六节齐 |
| ③ 逐字稿 | narration.md ★单一事实源 | [03](../../../apps/negentropy-influence/pipeline/skills/03-narration.md) | `pipeline.py build` | `build_narration.py` 通过 |
| ④⑤ 双重校验 + 分镜 | 真实性回溯 + 易懂性;beat 覆盖性 | [04](../../../apps/negentropy-influence/pipeline/skills/04-verification.md) / [05](../../../apps/negentropy-influence/pipeline/skills/05-storyboard.md) | `pipeline.py check`(+`--check-scenes`) | RISKY=0;覆盖率无缺句 |
| ⑥ TTS 配音 | 本人音色克隆(IndexTTS-2.5) | [07](../../../apps/negentropy-influence/pipeline/skills/07-tts-voice.md) | `pipeline.py tts --plan` | refs 指纹门 + 试听 + ETA |
| ⑦ Remotion 场景 | 代码动画实现 | [06](../../../apps/negentropy-influence/pipeline/skills/06-remotion-implementation.md) | `tsc --noEmit` | 七条渲染红线 |
| ⑧ 草渲 + 抽帧 QA | 半分辨率快速迭代 | [08](../../../apps/negentropy-influence/pipeline/skills/08-render-qa.md) | `pipeline.py render` + `qa` | 自动体检零 FAIL |
| ⑨ 终渲 + 交付 | 1080p30 + srt/vtt | [09](../../../apps/negentropy-influence/pipeline/skills/09-final-render.md) | `render --final` + `captions` | 实测时长在预算窗 |

## 关键不变量

- 逐字稿只改 `narration.md`;`narration.json`/`manifest.json` 是派生物。
- **口播永不出现他集标题与集数序号**——顺序只在视觉层与 [media/series.json](../../../media/series.json)(校验:`check_series.py`)。
- **口播永不出现他集标题与集数序号**——顺序只在视觉层与 [series.json](../../../apps/negentropy-influence/series.json)(校验:`check_series.py`)。
多系列(顶层 `seriesList[]`)语义:反串线规则**跨系列全局**,顺序类规则**按系列内**判定。
- **证据分级**:B 型信源里「他人对闭源产品源码的分析」属三级证据,口播必须带归属句,
不得表述为产品既成事实;活数据(行数、总量、star 数)不进口播。
- 每集 `pipeline.toml` 是可执行参数的唯一来源;README 不复制命令行参数。
- 时序常数只在 `video/src/timing.json`(timing.ts 与 Python 共读)。
- 声音样本是生物特征:不入库(`voices/refs.toml` 只存指纹),试听后即删。
- 新集脚手架与复用边界(Python 集中 SSOT / Remotion 复制不共享)见 [media/pipeline/README.md](../../../media/pipeline/README.md)。
- 新集脚手架与复用边界(Python 集中 SSOT / Remotion 复制不共享)见 [pipeline/README.md](../../../apps/negentropy-influence/pipeline/README.md)。
50 changes: 16 additions & 34 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -294,39 +294,21 @@ benchmarks/runs/
# 此条兜底 agent 路径漂移误在 worktree 写候选的极端场景,确保其永不进 commit/PR)
patrol-candidate.md

# 科普视频工程(media/self-improving-agents-video)本地产物:
# 科普视频工程(apps/negentropy-influence/episodes/<slug>-video)本地产物:
# tts.py 逐句音频 + manifest、Remotion 渲染产物均环境相关,不入 git。
# 注:工程内的 .gitignore 被上方根级裸 `.gitignore` 规则挡住无法提交,规则须维护在此处。
media/self-improving-agents-video/video/public/audio/
media/self-improving-agents-video/out/
media/self-improving-agents-video/**/*.mp4
media/self-improving-agents-video/**/*.mp3
media/self-improving-agents-video/**/*.wav

# 科普视频工程(media/experience-era-agents-video)本地产物:同上集规则。
media/experience-era-agents-video/video/public/audio/
media/experience-era-agents-video/out/
media/experience-era-agents-video/**/*.mp4
media/experience-era-agents-video/**/*.mp3
media/experience-era-agents-video/**/*.wav

# 声音克隆参考样本(media/pipeline/voices/):个人声音属生物特征信息,绝不入库。
# 目录级忽略 + 白名单例外(README 与 refs.toml 指纹清单——后者只存哈希与生成参数,
# 不含音频字节),防漏网音频格式(ogg/opus/wma 等)。
media/pipeline/voices/*
!media/pipeline/voices/README.md
!media/pipeline/voices/refs.toml

# 科普视频工程(media/self-evolving-coding-agents-video)本地产物:同上集规则。
media/self-evolving-coding-agents-video/video/public/audio/
media/self-evolving-coding-agents-video/out/
media/self-evolving-coding-agents-video/**/*.mp4
media/self-evolving-coding-agents-video/**/*.mp3
media/self-evolving-coding-agents-video/**/*.wav

# 科普视频工程(media/claude-code-explained-video)本地产物:同上集规则。
media/claude-code-explained-video/video/public/audio/
media/claude-code-explained-video/out/
media/claude-code-explained-video/**/*.mp4
media/claude-code-explained-video/**/*.mp3
media/claude-code-explained-video/**/*.wav
# 通配到集:`*` 只吃一级目录名(= 分集目录),故**新增分集无需再改本文件**
# —— 此前逐集枚举导致新集的音频产物在补齐 5 行前完全未被覆盖。
# `out/` 已由上方通用规则(第 223 行 `out/`,非锚定)覆盖,此处不再逐集重复。
apps/negentropy-influence/episodes/*/video/public/audio/
apps/negentropy-influence/episodes/**/*.mp4
apps/negentropy-influence/episodes/**/*.mp3
apps/negentropy-influence/episodes/**/*.wav

# 声音克隆参考样本(apps/negentropy-influence/pipeline/voices/):个人声音属生物
# 特征信息,绝不入库。目录级忽略 + 白名单例外(README 与 refs.toml 指纹清单——
# 后者只存哈希与生成参数,不含音频字节),防漏网音频格式(ogg/opus/wma 等)。
# 注:必须写 `/*` 而非 `/` —— git 无法用 `!` 把被排除**目录**内的文件重新纳入。
apps/negentropy-influence/pipeline/voices/*
!apps/negentropy-influence/pipeline/voices/README.md
!apps/negentropy-influence/pipeline/voices/refs.toml
22 changes: 13 additions & 9 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,16 @@ repos:
files: ^apps/negentropy/
types_or: [python, pyi]

# ── Python: media/pipeline(科普视频公共管线) ─────────────────────────
# ── Python: negentropy-influence/pipeline(科普视频公共管线) ──────────
# 与 negentropy 同一 ruff 修订版;此前仅覆盖 apps/negentropy/,管线脚本无 lint 门
- id: ruff
name: ruff lint (media-pipeline)
name: ruff lint (influence-pipeline)
args: [--fix, --exit-non-zero-on-fix]
files: ^media/pipeline/
files: ^apps/negentropy-influence/pipeline/
types_or: [python, pyi]
- id: ruff-format
name: ruff format (media-pipeline)
files: ^media/pipeline/
name: ruff format (influence-pipeline)
files: ^apps/negentropy-influence/pipeline/
types_or: [python, pyi]

# ── Node.js: apps/negentropy-ui ──────────────────────────────────────────
Expand Down Expand Up @@ -119,14 +119,18 @@ repos:
files: ^(VERSION|scripts/sync_versions\.py|package\.json|apps/negentropy/(pyproject\.toml|uv\.lock)|apps/negentropy-ui/package\.json|apps/negentropy-wiki/package\.json|apps/negentropy-perceives/(pyproject\.toml|uv\.lock)|packages/agents-chat-core/package\.json)$
pass_filenames: false

# ── 科普视频系列一致性(media/series.json 执法) ─────────────────────────
# ── 科普视频系列一致性(series.json 执法) ───────────────────────────────
# 规则:口播反串线(自身标题排除)/多标题顺序/序号绑定/清单完整性/相对链接死链。
# 注意:挂在内容修复之后落地;顺序调整类变更须先改 series.json 再动散文。
# ⚠️ files: 写错是**静默**失效(钩子直接跳过、不报错),entry 写错才会响。
# 改动本条后须验证:暂存一处子项目内改动,确认钩子 Passed 而非 Skipped。
# `.agent/skills/science-video-pipeline/` 亦须在列 —— 该路由壳有 13 条入树
# 链接受规则 5 执法,只改它的提交必须能触发本钩子。
- repo: local
hooks:
- id: series-consistency-check
name: Series consistency (media/series.json)
name: Series consistency (series.json)
language: system
entry: uv run --no-project media/pipeline/scripts/check_series.py
files: ^(media/|docs/\.agents/knowledge-map\.md|CHANGELOG\.md)
entry: uv run --no-project apps/negentropy-influence/pipeline/scripts/check_series.py
files: ^(apps/negentropy-influence/|\.agent/skills/science-video-pipeline/|docs/\.agents/knowledge-map\.md|CHANGELOG\.md)
pass_filenames: false
Loading