From 0395043a6d548b825343c7141be49cd611528227 Mon Sep 17 00:00:00 2001 From: zhanglinghao Date: Sun, 4 Oct 2026 03:16:05 +0800 Subject: [PATCH 1/5] Review desk: tick, comment and submit each stop in a page; the agent wakes on submit (bin/vh desk) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The static review page could only be read: replies went back through chat as codes, outlines and captions were raw .md links, and every page was a one-off. The maintainer tried a prototype desk on a real film, submitted through it twice, and asked for an automatic hand-back, outlines split by content, reusable infrastructure, studio as its home, and zh/en by the first request. - tools/desk/: stdlib server on 127.0.0.1 (Host check, per-run token, same origin, project files only, HTTP Range), a reader that turns the project's own files into the desk's data and renders anything it can't parse as escaped markdown with a warning, feedback that lands in out/review/feedback/ and verbatim in REVIEW.md, and a watcher. - bin/vh desk | desk wait | desk feedback | desk data; bin/vh new --lang zh|en writes the BRIEF's new "Review language" line, which the desk and bin/vh review (when the gate JSON has no lang) follow. - The data contract in tools/desk/README.md, including three optional gate JSON keys (listen, music labels, film) that replace the prototype's hardcoded bits; templates updated to match (BRIEF Outline table named by content, SCRIPT caption table with 术语, DECISIONS strikethrough, NOTES 上屏说法). - Effort wiring: studio stops in the desk with the watcher armed in the background, chat as the fallback (CLAUDE.md, playbook/01, bin/vh effort). - Docs learned on the film: outline names by content, a concept serves the stated focus, endings that lift the theme without slogans, the optional 术语卡, at least one light look, and sweeping stale lines after a gate. - CI: the reader on committed zh/en fixtures (incl. the fallback), a server on a free port, a submission waking the watcher and landing in REVIEW.md, the timeout, new --lang and review's language default. --- .gitignore | 1 + AGENTS.md | 11 +- CHANGELOG.md | 17 + CLAUDE.md | 11 +- README.md | 5 +- README.zh-CN.md | 5 +- bin/vh | 29 +- playbook/01-pipeline.md | 25 +- playbook/03-motion-design.md | 1 + playbook/09-narrative.md | 5 +- playbook/12-ideation.md | 3 +- templates/BRIEF.md | 8 + templates/DECISIONS.md | 3 +- templates/NOTES.md | 7 +- templates/SCRIPT.md | 3 + tools/ci.sh | 134 +++- tools/desk/README.md | 135 ++++ tools/desk/desk.py | 71 ++ tools/desk/feedback.py | 253 +++++++ tools/desk/fixtures/en/BRIEF.md | 24 + tools/desk/fixtures/en/DECISIONS.md | 10 + tools/desk/fixtures/en/NOTES.md | 11 + tools/desk/fixtures/en/REVIEW.md | 6 + tools/desk/fixtures/en/SCRIPT.md | 7 + tools/desk/fixtures/zh/BRIEF.md | 32 + tools/desk/fixtures/zh/DECISIONS.md | 17 + tools/desk/fixtures/zh/NOTES.md | 13 + tools/desk/fixtures/zh/REVIEW.md | 23 + tools/desk/fixtures/zh/SCRIPT.md | 11 + tools/desk/fixtures/zh/STORYBOARD.md | 8 + tools/desk/fixtures/zh/audio/music.beats.json | 6 + tools/desk/fixtures/zh/out/review/gate-1.json | 20 + tools/desk/fixtures/zh/shots.json | 8 + tools/desk/reader.py | 653 ++++++++++++++++++ tools/desk/server.py | 245 +++++++ tools/desk/static/desk.css | 193 ++++++ tools/desk/static/desk.js | 536 ++++++++++++++ tools/desk/static/index.html | 41 ++ tools/review.py | 20 +- video-types/02-knowledge-short.md | 1 + 40 files changed, 2574 insertions(+), 38 deletions(-) create mode 100644 tools/desk/README.md create mode 100644 tools/desk/desk.py create mode 100644 tools/desk/feedback.py create mode 100644 tools/desk/fixtures/en/BRIEF.md create mode 100644 tools/desk/fixtures/en/DECISIONS.md create mode 100644 tools/desk/fixtures/en/NOTES.md create mode 100644 tools/desk/fixtures/en/REVIEW.md create mode 100644 tools/desk/fixtures/en/SCRIPT.md create mode 100644 tools/desk/fixtures/zh/BRIEF.md create mode 100644 tools/desk/fixtures/zh/DECISIONS.md create mode 100644 tools/desk/fixtures/zh/NOTES.md create mode 100644 tools/desk/fixtures/zh/REVIEW.md create mode 100644 tools/desk/fixtures/zh/SCRIPT.md create mode 100644 tools/desk/fixtures/zh/STORYBOARD.md create mode 100644 tools/desk/fixtures/zh/audio/music.beats.json create mode 100644 tools/desk/fixtures/zh/out/review/gate-1.json create mode 100644 tools/desk/fixtures/zh/shots.json create mode 100644 tools/desk/reader.py create mode 100644 tools/desk/server.py create mode 100644 tools/desk/static/desk.css create mode 100644 tools/desk/static/desk.js create mode 100644 tools/desk/static/index.html diff --git a/.gitignore b/.gitignore index 7bbf24a..cc67e14 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules/ out/ +!tools/desk/fixtures/*/out/ renders/ .venv/ references/repos/ diff --git a/AGENTS.md b/AGENTS.md index 533d04a..542d826 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ 2. **读流程和自查**:读 `playbook/01-pipeline.md` 和 `playbook/02-verification.md`;涉及配音或音乐时,再读 `playbook/04-audio.md`。 3. **建项目**:运行 `bin/vh new `,它会建好 `projects/<日期>-/`,复制模板,并把该类型的 prompt 块填进 BRIEF(类型的默认做法,立意定了再取舍);手绘类还会复制引擎、装好依赖。其他引擎的初始化方式见 `engines/README.md`。 4. **先想立意,再看案例和参考**:建完项目,先把材料里只属于它的数字、原话、物件列进 NOTES.md 的素材清单,自己想 5–8 个点子;这时先不看 BRIEF 末尾的 TYPE 块、`styles/`、`recipes/` 和案例,免得点子往看过的东西上靠。然后再看下面这些参考,用它们补强,收敛成 2–3 张立意卡(做法见 `playbook/12-ideation.md`,例子见 `cases/oneshot-five.md`)。人已经给了立意,就记进 BRIEF,不再出卡,最多附一个备选。参考:打开类型文档"可参考的案例"和"社区 skill 参考"两节列出的文件;需要看真实代码时读 `references/repos/` 里的源码。本仓库自己做过的片子在 `showcase/`,各带 BRIEF、STORYBOARD、NOTES 和源码,是最直接的样板。分镜时,镜头怎么动、全片节奏怎么排,先查 `recipes/`:按意图和能量筛(`bin/vh recipes list`),把选中的配方 id 写进 STORYBOARD 的"配方"列,写代码前读配方全文。 -5. **停下来给人审**:`standard` 和 `studio` 必过下面三道关卡,`quick` 不设关卡;人点名要亲自拍板的事,按"导演模式"另外停,`quick` 也一样。每次停默认做一页决定优先的审阅页(`bin/vh review` 生成本地 HTML,做法见 `playbook/01-pipeline.md` 的"审阅页"),聊天里只发要人定的事和页面路径;只有一两个纯文字的选择时,直接在聊天里问也行。然后**停下来等人回复**,不要自己往下做: +5. **停下来给人审**:`standard` 和 `studio` 必过下面三道关卡,`quick` 不设关卡;人点名要亲自拍板的事,按"导演模式"另外停,`quick` 也一样。每次停默认做一页决定优先的审阅页(`bin/vh review` 生成本地 HTML,做法见 `playbook/01-pipeline.md` 的"审阅页"),聊天里只发要人定的事和页面路径;只有一两个纯文字的选择时,直接在聊天里问也行。`studio` 默认在审阅台停(`bin/vh desk`,同一份 gate JSON,人在页面里逐条勾选、点评、提交):停之前在后台挂上 `bin/vh desk wait`,人一提交就接着做;没有后台唤醒的 agent 退回"人回聊天说一声"(`playbook/01-pipeline.md` 的"审阅台")。审阅页和审阅台的界面语言按用户第一句话的语言定(BRIEF 的 `Review language`,`bin/vh new … --lang en`)。然后**停下来等人回复**,不要自己往下做: - ① **立意和大纲**:2–3 张彼此拉得开的立意卡,每张写明由它推出的画面(专属风格,或参考 `styles/` 的预设,可以几个)和钩子,配一帧画面(`playbook/12-ideation.md` 第 7 节)。选一张卡,立意、风格方向和钩子就一起定了,人可以在回复里换预设或钩子。再附按推荐立意写的 BRIEF、3–7 段大纲、引擎和费用。不要默认只给一种口味; - ② **分镜**:按大纲的段落拆页,每页 3–6 镜的关键帧,没把握的镜头标出来,逐镜默认通过。长片再附一版全长灰盒 animatic; - ③ **初版**:draft 成片加联系表,并写出你自己最不满意的 2–3 处。 @@ -38,6 +38,7 @@ |---|---|---|---| | 适合 | 试方向、草稿、随手发 | 大多数正式视频 | 发布片、旗舰内容、会被反复看的片子 | | 人工关卡 | 0 道,直接出片。选 quick 就等于授权跳过关卡,把这一点记进 REVIEW.md;需求有歧义时最多问 1 个问题;人点名要拍板的事照样停(导演模式) | 3 道 | 3 道;关卡 ① 每张立意卡附一段 10–20 s 草图,关卡 ② 附全长 animatic | +| 在哪审 | 不设关卡;导演模式要停的在聊天里问,或用静态审阅页 | 静态审阅页(`bin/vh review`);人想逐条勾选、点评时开审阅台(`bin/vh desk`) | 审阅台(`bin/vh desk`):人在页面里勾选、点评、提交;每次停后在后台挂上 `bin/vh desk wait`,提交就接着做;没有后台唤醒的 agent 退回"人回聊天说一声" | | 立意 | 自己想 3 个一句话点子,挑 1 个,写一行理由 | 关卡 ① 给 2–3 张立意卡,每张配一帧画面 | 同左,每张配一段 10–20 s 的草图(look-dev) | | 风格 | 从立意推出来,可以参考 `styles/` 的预设,写明借了什么 | 写在每张立意卡的"画面"一行(专属,或借一个预设);选卡就一起定了,人可以在回复里换 | 同左;每张卡的草图就是那种风格的小样,借来的预设人想看时在 E0 补小样 | | 分镜 | 简表:镜头、时长、reads | 完整 STORYBOARD + 分镜预览图 | 同左 + animatic | @@ -77,7 +78,7 @@ effort 管 agent 自己查得多细,导演模式管人拍板哪些事,两个 - `review`:agent 出一个结果,放进下一页(没有下一页就随交付给),不为它单独停,人不说话就算通过; - `delegate`:agent 自己定,写进 `DECISIONS.md`,人随时能翻案。 - **没点名的按档位**:`quick` 全部 `delegate`;`standard` 的 `concept` 是 `own`(风格和钩子写在立意卡上,选卡就一起定了;人单独点名 `style` 或 `hook` 时另问),`outline` 和 `storyboard` 是 `review`,其余 `delegate`;`studio` 同 `standard`,其余改成 `review`。 -- **每次停,默认做一页审阅页**,聊天里只发 `bin/vh review` 打印的几行;只有一两个纯文字的选择时,直接在聊天里问也行。一页默认最多 3 个决定,每个带推荐,上游的先问,其余默认通过;人想一次看更多也可以。人的原话逐字记进 `REVIEW.md`。人说不清哪里不对时,先做 look-dev:同一段 10–20 s,只改一个变量,出 2–3 个变体。 +- **每次停,默认做一页审阅页**,聊天里只发 `bin/vh review` 打印的几行;`studio` 再开审阅台(`bin/vh desk`),把它的地址一起发;只有一两个纯文字的选择时,直接在聊天里问也行。一页默认最多 3 个决定,每个带推荐,上游的先问,其余默认通过;人想一次看更多也可以。人的原话逐字记进 `REVIEW.md`。人说不清哪里不对时,先做 look-dev:同一段 10–20 s,只改一个变量,出 2–3 个变体。 - **关卡是底线**:`standard` 和 `studio` 的关卡 ①②③ 照停,导演模式只加停、不减停;要全程不停,只能由用户本人说"不用审、直接出"。 ## quick 路径卡 @@ -147,13 +148,13 @@ OpenVideoHarness/ ├── install.sh 一键安装(克隆、依赖、参考仓库、注册 skill) ├── CONTRIBUTING.md 改本仓库本身时的分支、PR 和推送规则(人和 agent 都适用) ├── .github/ CI(Linux + macOS 跑 tools/ci.sh)和 main 分支的规则集 -├── bin/vh 命令行:doctor · setup · types · effort · new · style · recipes · hf-init · install-skill · sync-agents · tts · voices · captions · beats · music · sfx · mix · mux · qa · readcheck · storyboard · rhythm · cover-preview · sheet · check · gif · review -├── tools/ bin/vh 背后的脚本(audio/:tts、captions、beats、music、sfx、mix、qa;sheet.py、readcheck.py、review.py;给人拍板用的图:storyboard.py、rhythm.py、style_compare.py、cover_preview.py、audio/roll.py,共用 vhdraw.py);ci.sh 是仓库自检 +├── bin/vh 命令行:doctor · setup · types · effort · new · style · recipes · hf-init · install-skill · sync-agents · tts · voices · captions · beats · music · sfx · mix · mux · qa · readcheck · storyboard · rhythm · cover-preview · sheet · check · gif · review · desk +├── tools/ bin/vh 背后的脚本(audio/:tts、captions、beats、music、sfx、mix、qa;sheet.py、readcheck.py、review.py;desk/:审阅台的服务、读取约定和等待提交,约定写在 desk/README.md;给人拍板用的图:storyboard.py、rhythm.py、style_compare.py、cover_preview.py、audio/roll.py,共用 vhdraw.py);ci.sh 是仓库自检 ├── skills/open-video-harness/ 轻量 skill:在任何目录把做视频的请求引到本仓库 ├── video-types/ 9 类视频(09 实验中):工作流、审美、禁止项、prompt 增量块、自查重点、案例、社区 skill ├── playbook/ 跨类型的通用知识 │ ├── 00-paradigm.md 范式与引擎选型 -│ ├── 01-pipeline.md 十阶段流程(0–9)、reads、人工关卡、导演模式和审阅页、subagent 并行 +│ ├── 01-pipeline.md 十阶段流程(0–9)、reads、人工关卡、导演模式、审阅页和审阅台、subagent 并行 │ ├── 02-verification.md 验证闭环与各引擎的取帧命令 │ ├── 03-motion-design.md 缓动、时长、排版、安全区、转场 │ ├── 04-audio.md 配音(双语)、字幕、配乐、音效、歌曲、混音 diff --git a/CHANGELOG.md b/CHANGELOG.md index d6269b8..2d85b53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,23 @@ ## Unreleased +**The review desk: tick, comment and submit in a page, and the agent carries on by itself (`bin/vh desk`)** +- Why: reviewing a film's first gate through the static pages, the maintainer found the outline, captions and stages hard to read (some were raw `.md` links), had no way to tick or comment in place, had to reply in chat with codes like "1 S1", and got a new one-off page every time. A prototype desk fixed that, and after two real rounds in it: "返回还是要手动给你触发,我觉得可以加一个监控", the outline should be split by content, not by 起承转合, reuse needs a basic infrastructure, and the desk belongs to `studio`, in Chinese or English by the first request. +- `tools/desk/` (stdlib Python, offline, no CDN, light and dark): `bin/vh desk [--port N]` serves one project on 127.0.0.1 (the first free port of 8780–8799; a second start prints the running one's address). Ten views read fresh from the project's own files: this round (decisions with options, least sure, decided for you), concept and outline (a time bar by segment), captions or narration (grouped by segment, term chips, a rough reading speed), the storyboard synced to its video, sound (sections named from the gate JSON, listen prompts, timecoded notes), fact check, the film with timecoded notes (C key), the decision ledger, history, and every doc rendered as text. Any item can be marked ok / change / question with a line and a "change to"; a tray collects them and submits once. +- A submission is checked (a real gate page, its decisions and options, sizes) and written as `out/review/feedback/-