diff --git a/AGENTS.md b/AGENTS.md index d06fa84..e71d539 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -43,10 +43,10 @@ | 风格 | 从立意推出来,可以参考 `styles/` 的预设,写明借了什么 | 写在每张立意卡的"画面"一行(专属,或借一个预设);选卡就一起定了,人可以在回复里换 | 同左;每张卡的草图就是那种风格的小样,借来的预设人想看时在 E0 补小样 | | 分镜 | 简表:镜头、时长、reads | 完整 STORYBOARD + 分镜预览图 | 同左 + animatic | | 自查 | 整片一张联系表、一张按目标屏缩的联系表、前 2 s 的 strip,20 条清单速查一遍 | 每个场景:联系表、关键动作 strip、局部 crop;20 条清单 | 同左,再加目标屏尺寸测试、循环接缝、无损帧确定性、静默故障扫描 | -| 独立评审(打分层) | 不做 | 1 轮:全新上下文的 reviewer 打 8 项分(含立意),修最差的 3 处 | ≥ 3 轮,8 项都 ≥ 8 才出片;达不到就带着分数进关卡 ③ | +| 独立评审(打分层) | 不做 | 1 轮:全新上下文的 reviewer 打 8 项分(含立意),修最差的 3 处,改过的段落做局部复查 | ≥ 3 轮、最多 10 轮,8 项都 ≥ 8 才出片;同一类问题最多改 5 次,小修只做局部复查;到上限还没过线,就带着分数进关卡 ③ | | 声音 | 可以没有,或一段配乐 / 配音加基础混音 | 配乐或配音 + 关键动作音效 + 按视频类型的混音 profile(`bin/vh mix … profile=`)+ `bin/vh qa` | 同左 + 每个动作的拟音和声像 + 最终混音 cue check + 混音报告(`bin/vh qa mix`)没有硬失败 | | 渲染与交付 | draft 画质即可,一个 mp4 | 正式画质 mp4 + 联系表 | 同左 + 网页版、GIF、封面,按需出 9:16 | -| draft 版数 | 1–2 版 | 一般 3–5 版 | 不设上限,直到过线 | +| draft 版数 | 1–2 版 | 一般 3–5 版 | 不设上限,直到过线(整片评审的轮数另有上限,见"独立评审"一行) | | subagent | 不用 | 长片按章节并行 | 并行制作 + 独立评审,按需加作曲 subagent | | 参考研究 | 只读类型文档 | + 类型文档列的案例 | + 拉片参考(`playbook/07`)、深读 `references/` | | 大致耗时(30 s 左右的片子) | 10–30 分钟 | 1–2 小时 | 3 小时以上 | @@ -54,18 +54,20 @@ 最后一行是给能调推理强度的 agent 的建议(例如 Claude Code 选模型时的 effort 档位),不能调就忽略。 +**评审有上限**:整片评审(全新上下文的 reviewer 看完整片、打满 8 项分)一支片子最多 10 轮;同一类问题(同一条清单条目落在同一个镜头或段落上)最多改 5 次,改不动就写进 NOTES 的"已知局限"交给人;一条标签的时间、一个音效的音量这类小修,只查改过的那一段,不为它重开整片评审。后一轮在口味条目上推翻前一轮时,可以保留前一轮的决定,在 `DECISIONS.md` 记一行为什么。细则见 `TASTE_CHECKLIST.md` 的打分层。 + **任何档位都不降的底线**: - 硬规则 1(每一帧是 t 的纯函数)、5(事实照抄原文)、7(不在文件里写 key); - 片中不出现数字静音(管有声片;用户要的无声片不带音轨,不适用); - 全屏闪白每秒不超过 3 次; - 字号不低于 BRIEF"在哪看"那一档的下限(`playbook/03-motion-design.md` §4); - 素材许可要记清; -- `TASTE_CHECKLIST.md` 里标【底线】的条目:安全框、读时、字号、字不被光烧白、reads 不被盖掉、循环接缝、分镜里声明的卡点、没有占位和编造; +- `TASTE_CHECKLIST.md` 里标【底线】的条目:安全框、读时(够快读一遍;从容多少跟 BRIEF 的 `Pace` 走,是口味)、字号、字不被光烧白、reads 不被盖掉、循环接缝、分镜里声明的卡点、没有占位和编造; - 出片前跑一次 `bin/vh check`。 `quick` 省掉的是轮数和审阅,不是这些。 -**底线之外都是默认口味**:`TASTE_CHECKLIST.md` 里没标【底线】的条目、BRIEF 的 Motion defaults、类型文档 Prompt 增量块里的语域和节拍、镜头配方,都是没有立意时的稳妥做法。风格预设只是参考:借了什么在 `DECISIONS.md` 记一行,不借、借一半、几个混着借都行,和它不一样不用解释;借来的东西碰到清单里没标【底线】的条目,照口味覆盖记一行。立意需要时可以反着来:在写用到它的场景之前,把改了什么、立意为什么需要写在立意卡或 STYLE.md 上,记进 `DECISIONS.md`;人批过的卡上写了的,算人的决定,reviewer 只查有没有做到;之后才加的由 reviewer 判断站不站得住,判了 FAIL 再补的不算(`playbook/12-ideation.md` 第 6 节)。类型文档"禁止"一节也分两种:管事实、许可、可读和隐私的是底线,管长相的(配色、质感、缓动、图表样式)是默认口味。规则是用来防止犯错的,不是用来规定口味的。 +**底线之外都是默认口味**:`TASTE_CHECKLIST.md` 里没标【底线】的条目、BRIEF 的 Motion defaults 和 `Pace`、类型文档 Prompt 增量块里的语域和节拍、镜头配方,都是没有立意时的稳妥做法。风格预设只是参考:借了什么在 `DECISIONS.md` 记一行,不借、借一半、几个混着借都行,和它不一样不用解释;借来的东西碰到清单里没标【底线】的条目,照口味覆盖记一行。立意需要时可以反着来:在写用到它的场景之前,把改了什么、立意为什么需要写在立意卡或 STYLE.md 上,记进 `DECISIONS.md`;人批过的卡上写了的,算人的决定,reviewer 只查有没有做到;之后才加的由 reviewer 判断站不站得住,判了 FAIL 再补的不算(`playbook/12-ideation.md` 第 6 节)。类型文档"禁止"一节也分两种:管事实、许可、可读和隐私的是底线,管长相的(配色、质感、缓动、图表样式)是默认口味。规则是用来防止犯错的,不是用来规定口味的。 ## 导演模式:谁来拍板 @@ -129,7 +131,7 @@ effort 管 agent 自己查得多细,导演模式管人拍板哪些事,两个 1. **每一帧都是 t 的纯函数。** 不用 `Math.random()`、`Date.now()`、CSS transition 或 `@keyframes`,不保存跨帧状态;需要随机时用带种子的 `hash(i)`。乱序渲染同一帧,结果必须一致。检验方法:从中间抽几帧单独渲染,和整片里的同一帧比对,要逐像素相同;如果 GPU 光栅化带来细微差异,PSNR 至少 45 dB,而且肉眼看不出。比的是无损 PNG 帧,不是编码后的 mp4(x264 会放大差异)。 2. **有声音时,音频决定时长。** 先生成配音或拿到歌曲,转成词级时间戳和节拍表,再用实测时长回写分镜,让画面去对齐音频。静音视频的时长由分镜里的 reads 决定,画面必须在静音下读得懂。 3. **先分镜后代码。** 分镜里给每个镜头写出观众必须依次看懂的 reads,并标起止时间;重要的 reads 不能重叠。 -4. **每个场景都要自查。** 至少包括:一张联系表,关键动作一条逐帧 strip,承载剧情的脸或细节一个 crop;对照 `TASTE_CHECKLIST.md`,发现问题就修。整片 draft 还要过清单里的打分层:换一个严苛的 reviewer 按 8 个维度(含立意)打分,每项都要 ≥ 8。自查成本很低,不要省。 +4. **每个场景都要自查。** 至少包括:一张联系表,关键动作一条逐帧 strip,承载剧情的脸或细节一个 crop;对照 `TASTE_CHECKLIST.md`,发现问题就修。整片 draft 还要过清单里的打分层:换一个严苛的 reviewer 按 8 个维度(含立意)打分,每项都要 ≥ 8;轮数有上限,小修只查改过的那一段(见上面的"评审有上限")。自查成本很低,不要省。 5. **事实有纪律。** 论文元数据、数字、引文一律照抄原文;拿不准的写进 `NOTES.md`,不编进视频。 6. **只在 `projects/` 里改东西。** `engines/` 是模板,`references/repos/` 是只读参考;需要时复制到自己的项目里再改。 7. **不在文件里写 API key。** 一律从环境变量读取;缺 key 时告诉用户需要哪个。 diff --git a/CHANGELOG.md b/CHANGELOG.md index 58f3758..4381b6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ## Unreleased +**Review rounds have caps; reading time follows the film's pace instead of fixed seconds** +- Why: a `studio` film's independent review ran 11 full rounds: each fresh reviewer found new taste nits, the scores hovered at 7–9, and small fixes sometimes broke something else. The maintainer: "我觉得可以了 其实我觉得也不必要你每次这么十几轮审阅 太多了 给项目加一个限制,每一种问题不超过5次,总共不超过10次,不要为了一个小问题就全部来一遍Review。另外,项目中关于字的节奏也不要写死间隔时间,有的时候太慢。" +- Review caps (`templates/TASTE_CHECKLIST.md`'s scoring layer; CLAUDE.md / AGENTS.md: the effort table and a new 评审有上限 paragraph; playbook/01 and 02; both READMEs; `templates/NOTES.md` and `REVIEW.md`; video-types/09). A film gets at most 10 full review rounds (a fresh-context reviewer scoring all eight dimensions over the whole film); then it ships, or the scores go to the human at gate ③. The same kind of issue (one checklist item on one shot or segment) gets at most 5 fix-and-check cycles, then goes into NOTES as a known limitation with its last evidence, for the human to decide. A local fix (one label's timing or size, a safe-frame nudge, an SFX level, one shot's layout) is checked on its own span: its frames and strips, the automated checks that cover it, the author's look; a new full round is for structural changes or the last pass. The minimums stay (standard 1 round; studio at least 3, all eight at 8 or above, and those three rounds run even when only small fixes happen in between). When the human sends a film back at gate ③ with new notes, both counts restart. A 【底线】 item still failing at its cap goes to the human; until they decide, nothing ships as final, and an unattended run labels its output "has a floor FAIL, not a release". When a later round contradicts an earlier one on a taste item, the author may keep the earlier decision with a line in DECISIONS. NOTES gets 评审记录 (one line a round), a 问题计数 table and 已知局限; the reviewer is given the known limitations so it stops re-raising them. `bin/vh effort standard|studio` prints the caps. +- Reading time has no fixed seconds. The floor (TASTE_CHECKLIST #5, 【底线】) is one brisk read: max(1.5 s, CJK/7 + other/20 + 0.8 s), which is #53's short-label rule (the intro film was cut to it), now for all on-screen text. The comfortable target is a taste default set by a new BRIEF line, `- Pace: relaxed | normal | brisk` (default normal): relaxed CJK/4.5 + other/15 + 1.0 s, normal CJK/6 + other/18 + 0.8 s, brisk CJK/7 + other/20 + 0.8 s, which is the floor (the 8 CJK/s + 0.3 s first proposed for brisk sat under the floor at every length). Text the viewer already knows and short labels may run at brisk; text on a musical grid ends on a bar line instead of being padded. playbook/03 §2 explains the numbers; the old 2.5 s minimum and 1.5 s pad are gone; labels (`data-read="label"`) target the floor. +- `tools/readcheck.py`: the pace comes from `--pace`, else the nearest BRIEF.md's Pace line, else normal. Under the floor is a FAIL (exit 1), under the target only a WARN (exit 0); lines read OK / WARN / FAIL (was OK / BAD). `data-pace` on a clip or scene (nearest wins, sub-compositions included) and `"pace"` in texts.json set the target for the texts under it, and `--export` writes it. `--mode label` and `data-read="label"` keep working and mean a brisk target. `--cjk-cps`, `--latin-cps`, `--pad` and `--min` still work and retune the target only. `--budget` gives the pace's target and the floor; `bin/vh readcheck -h` prints the rules. `bin/vh rhythm` draws under-the-floor texts red and under-the-target ones amber. `bin/vh new` writes `- Pace: relaxed` for math and paper projects and `brisk` for meme, normal otherwise. CI covers the WARN band, the floor and its 1.5 s minimum, the BRIEF's Pace, `--pace`, a bad pace, and a new project's Pace line. +- Docs that restated 2.5 s now follow the rule: `templates/BRIEF.md` (Pace, Text rules), `templates/STORYBOARD.md`, video-types/01's prompt block, nine style presets, the recipes (black-card, breath-title-card and brand-imprint-open recomputed at normal: holds of 46, 62 and 45 frames, with their durations, QA frames and index rows; the sequence budgets say 读时 instead of ≥ 75 frames), `cases/promo-video-shotcraft.md`, and a current-state line in docs/research/04. + **Docs: a Douyin case study, a landscape variant for knowledge films, and two ideation prompts** - Why: of ten AI-made Douyin films (nine posted in late September 2026, most tagged #vibe知识大赏), the four most-liked (148k–667k likes) are all 16:9 and 2.5–5 min long. Type 02 had described 30–90 s vertical films as the main case; Douyin landscape films appeared only in `cases/oneshot-five.md`. - `cases/douyin-vibe-knowledge.md` covers the ten films: post date, likes (a 10-04 snapshot), length, frame and opening. It also records: diff --git a/CLAUDE.md b/CLAUDE.md index 4dfe700..8fe0232 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -40,10 +40,10 @@ | 风格 | 从立意推出来,可以参考 `styles/` 的预设,写明借了什么 | 写在每张立意卡的"画面"一行(专属,或借一个预设);选卡就一起定了,人可以在回复里换 | 同左;每张卡的草图就是那种风格的小样,借来的预设人想看时在 E0 补小样 | | 分镜 | 简表:镜头、时长、reads | 完整 STORYBOARD + 分镜预览图 | 同左 + animatic | | 自查 | 整片一张联系表、一张按目标屏缩的联系表、前 2 s 的 strip,20 条清单速查一遍 | 每个场景:联系表、关键动作 strip、局部 crop;20 条清单 | 同左,再加目标屏尺寸测试、循环接缝、无损帧确定性、静默故障扫描 | -| 独立评审(打分层) | 不做 | 1 轮:全新上下文的 reviewer 打 8 项分(含立意),修最差的 3 处 | ≥ 3 轮,8 项都 ≥ 8 才出片;达不到就带着分数进关卡 ③ | +| 独立评审(打分层) | 不做 | 1 轮:全新上下文的 reviewer 打 8 项分(含立意),修最差的 3 处,改过的段落做局部复查 | ≥ 3 轮、最多 10 轮,8 项都 ≥ 8 才出片;同一类问题最多改 5 次,小修只做局部复查;到上限还没过线,就带着分数进关卡 ③ | | 声音 | 可以没有,或一段配乐 / 配音加基础混音 | 配乐或配音 + 关键动作音效 + 按视频类型的混音 profile(`bin/vh mix … profile=`)+ `bin/vh qa` | 同左 + 每个动作的拟音和声像 + 最终混音 cue check + 混音报告(`bin/vh qa mix`)没有硬失败 | | 渲染与交付 | draft 画质即可,一个 mp4 | 正式画质 mp4 + 联系表 | 同左 + 网页版、GIF、封面,按需出 9:16 | -| draft 版数 | 1–2 版 | 一般 3–5 版 | 不设上限,直到过线 | +| draft 版数 | 1–2 版 | 一般 3–5 版 | 不设上限,直到过线(整片评审的轮数另有上限,见"独立评审"一行) | | subagent | 不用 | 长片按章节并行 | 并行制作 + 独立评审,按需加作曲 subagent | | 参考研究 | 只读类型文档 | + 类型文档列的案例 | + 拉片参考(`playbook/07`)、深读 `references/` | | 大致耗时(30 s 左右的片子) | 10–30 分钟 | 1–2 小时 | 3 小时以上 | @@ -51,18 +51,20 @@ 最后一行是给能调推理强度的 agent 的建议(例如 Claude Code 选模型时的 effort 档位),不能调就忽略。 +**评审有上限**:整片评审(全新上下文的 reviewer 看完整片、打满 8 项分)一支片子最多 10 轮;同一类问题(同一条清单条目落在同一个镜头或段落上)最多改 5 次,改不动就写进 NOTES 的"已知局限"交给人;一条标签的时间、一个音效的音量这类小修,只查改过的那一段,不为它重开整片评审。后一轮在口味条目上推翻前一轮时,可以保留前一轮的决定,在 `DECISIONS.md` 记一行为什么。细则见 `TASTE_CHECKLIST.md` 的打分层。 + **任何档位都不降的底线**: - 硬规则 1(每一帧是 t 的纯函数)、5(事实照抄原文)、7(不在文件里写 key); - 片中不出现数字静音(管有声片;用户要的无声片不带音轨,不适用); - 全屏闪白每秒不超过 3 次; - 字号不低于 BRIEF"在哪看"那一档的下限(`playbook/03-motion-design.md` §4); - 素材许可要记清; -- `TASTE_CHECKLIST.md` 里标【底线】的条目:安全框、读时、字号、字不被光烧白、reads 不被盖掉、循环接缝、分镜里声明的卡点、没有占位和编造; +- `TASTE_CHECKLIST.md` 里标【底线】的条目:安全框、读时(够快读一遍;从容多少跟 BRIEF 的 `Pace` 走,是口味)、字号、字不被光烧白、reads 不被盖掉、循环接缝、分镜里声明的卡点、没有占位和编造; - 出片前跑一次 `bin/vh check`。 `quick` 省掉的是轮数和审阅,不是这些。 -**底线之外都是默认口味**:`TASTE_CHECKLIST.md` 里没标【底线】的条目、BRIEF 的 Motion defaults、类型文档 Prompt 增量块里的语域和节拍、镜头配方,都是没有立意时的稳妥做法。风格预设只是参考:借了什么在 `DECISIONS.md` 记一行,不借、借一半、几个混着借都行,和它不一样不用解释;借来的东西碰到清单里没标【底线】的条目,照口味覆盖记一行。立意需要时可以反着来:在写用到它的场景之前,把改了什么、立意为什么需要写在立意卡或 STYLE.md 上,记进 `DECISIONS.md`;人批过的卡上写了的,算人的决定,reviewer 只查有没有做到;之后才加的由 reviewer 判断站不站得住,判了 FAIL 再补的不算(`playbook/12-ideation.md` 第 6 节)。类型文档"禁止"一节也分两种:管事实、许可、可读和隐私的是底线,管长相的(配色、质感、缓动、图表样式)是默认口味。规则是用来防止犯错的,不是用来规定口味的。 +**底线之外都是默认口味**:`TASTE_CHECKLIST.md` 里没标【底线】的条目、BRIEF 的 Motion defaults 和 `Pace`、类型文档 Prompt 增量块里的语域和节拍、镜头配方,都是没有立意时的稳妥做法。风格预设只是参考:借了什么在 `DECISIONS.md` 记一行,不借、借一半、几个混着借都行,和它不一样不用解释;借来的东西碰到清单里没标【底线】的条目,照口味覆盖记一行。立意需要时可以反着来:在写用到它的场景之前,把改了什么、立意为什么需要写在立意卡或 STYLE.md 上,记进 `DECISIONS.md`;人批过的卡上写了的,算人的决定,reviewer 只查有没有做到;之后才加的由 reviewer 判断站不站得住,判了 FAIL 再补的不算(`playbook/12-ideation.md` 第 6 节)。类型文档"禁止"一节也分两种:管事实、许可、可读和隐私的是底线,管长相的(配色、质感、缓动、图表样式)是默认口味。规则是用来防止犯错的,不是用来规定口味的。 ## 导演模式:谁来拍板 @@ -126,7 +128,7 @@ effort 管 agent 自己查得多细,导演模式管人拍板哪些事,两个 1. **每一帧都是 t 的纯函数。** 不用 `Math.random()`、`Date.now()`、CSS transition 或 `@keyframes`,不保存跨帧状态;需要随机时用带种子的 `hash(i)`。乱序渲染同一帧,结果必须一致。检验方法:从中间抽几帧单独渲染,和整片里的同一帧比对,要逐像素相同;如果 GPU 光栅化带来细微差异,PSNR 至少 45 dB,而且肉眼看不出。比的是无损 PNG 帧,不是编码后的 mp4(x264 会放大差异)。 2. **有声音时,音频决定时长。** 先生成配音或拿到歌曲,转成词级时间戳和节拍表,再用实测时长回写分镜,让画面去对齐音频。静音视频的时长由分镜里的 reads 决定,画面必须在静音下读得懂。 3. **先分镜后代码。** 分镜里给每个镜头写出观众必须依次看懂的 reads,并标起止时间;重要的 reads 不能重叠。 -4. **每个场景都要自查。** 至少包括:一张联系表,关键动作一条逐帧 strip,承载剧情的脸或细节一个 crop;对照 `TASTE_CHECKLIST.md`,发现问题就修。整片 draft 还要过清单里的打分层:换一个严苛的 reviewer 按 8 个维度(含立意)打分,每项都要 ≥ 8。自查成本很低,不要省。 +4. **每个场景都要自查。** 至少包括:一张联系表,关键动作一条逐帧 strip,承载剧情的脸或细节一个 crop;对照 `TASTE_CHECKLIST.md`,发现问题就修。整片 draft 还要过清单里的打分层:换一个严苛的 reviewer 按 8 个维度(含立意)打分,每项都要 ≥ 8;轮数有上限,小修只查改过的那一段(见上面的"评审有上限")。自查成本很低,不要省。 5. **事实有纪律。** 论文元数据、数字、引文一律照抄原文;拿不准的写进 `NOTES.md`,不编进视频。 6. **只在 `projects/` 里改东西。** `engines/` 是模板,`references/repos/` 是只读参考;需要时复制到自己的项目里再改。 7. **不在文件里写 API key。** 一律从环境变量读取;缺 key 时告诉用户需要哪个。 diff --git a/README.md b/README.md index e725bff..ed62f98 100644 --- a/README.md +++ b/README.md @@ -206,7 +206,7 @@ Not every film deserves the full process. Say "quick draft" or "studio quality" |---|---|---|---| | For | trying a direction, drafts | most real videos | launches, flagship pieces | | Stops for you | none | three | three, plus a short sample of each direction and a full-length animatic | -| Second-agent review | none | one round | at least three, all eight scores at 8 or above | +| Second-agent review | none | one round | three to ten, all eight scores at 8 or above; a small fix is rechecked on its own span, not with a new round | | A 30-second film takes about | 10–30 min | 1–2 h | 3 h or more | At every level: no invented facts, no sudden silence in a film with sound, no rapid flashing, and type no smaller than the floor for the target screen. diff --git a/README.zh-CN.md b/README.zh-CN.md index cbef345..bc574ba 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -206,7 +206,7 @@ AI 听不见,所以声音尽量做成能计算、能测量的: |---|---|---|---| | 适合 | 试方向、草稿 | 大多数正式视频 | 发布片、旗舰内容 | | 停下来等你 | 不停,直接出片 | 三次 | 三次,另附每个创意方向的样片和全片动态分镜(animatic) | -| 另一个 agent 打分 | 不打 | 1 轮 | 至少 3 轮,8 项都要 8 分以上 | +| 另一个 agent 打分 | 不打 | 1 轮 | 3 到 10 轮,8 项都要 8 分以上;小修只复查改过的那一段,不重开一轮 | | 30 秒的片子大概要 | 10–30 分钟 | 1–2 小时 | 3 小时以上 | 哪一档都不放松的:事实不编、有声片里没有突然的静音、画面不频闪、字不小于目标屏幕的下限。 diff --git a/bin/vh b/bin/vh index 0bc788a..7999755 100755 --- a/bin/vh +++ b/bin/vh @@ -52,8 +52,9 @@ # mux