Dalang — 从主题到视频
模式与视觉风格,在 Brief 中提出,并在其之后锁定(references/looks.md)。模式:Express(默认;在 Canvas 2D 中实现 2.5D,参见 references/express.md)或 Studio(精确:基于 three.js,代码优先,参考板,基准测试,审查)。视觉风格:等距系列(主要使用 isometric-world,以及 cutaway、blueprint)或 object-studio(在浅色背景上的研究模型)。3D 视觉风格不会自动将影片切换到 Studio 模式。如果在第 6 步之后更改视觉风格:停止所有构建器,重写 SPEC.md,并在一条消息中重新启动每个组;旁白和语音保持不变。
原则
第 7 条原则仅适用于 Studio 模式;其余原则在两种模式下均适用。
- 视觉论点优先(
references/looks.md):视觉风格的编号规则决定每一帧和质量控制。object-studio:浅色工作室,一个强调色,主体占 60–70%,单一输入机器,现场乐器,固定镜头。 - 文字优先,画面在后:脚本获批 → 语音 → 每个单词计时 → 视觉画面。
- 屏幕上的每次变化都与一个单词对应,基于计时数据。
- 主体在每个镜头中都有动作;镜头对准静止画面就是幻灯片。
- 用数据说话,不要猜测:每个报告的数字都来自日志或脚本。
- 所有问题提前提出,不阻塞用户。 所有问题在第 1 步提出;后续步骤不再等待用户。一旦通过各项检查,自行通过 4 个关卡中的每一个,用一行说明,然后运行到完成影片。后续变更为新的一轮。在最后一轮之前(除关卡 3 的风格帧和钩子样本外)不进行最终质量渲染。
- 风格化,忠于现实。 每部影片使用一种视觉风格;不使用素材、照片级渲染、生成图像或剪辑。零件、比例、尺度和行为符合真实参考(
references/visual-direction.md§1)。 - 顶级工作室水准,但不过度:风格帧、润色、审查评分标准。草稿使用 10 fps;最终版
--quality high --fps <brief fps>通过所有检查。 - 默认免费。 仅在用户要求时使用付费或按量计费服务(ElevenLabs、HeyGen),并标注“付费”。优先选用商用许可;当无法使用时需说明。
通用目的。 任意主题、语言、平台。绝不打开其他 video/<slug>/ 文件夹;除非用户选择了系列套件(references/brief.md 中的“系列套件”),否则不继承任何内容。engine/three/ 是一个工具箱,而非限制:它缺少的主体将根据其自身规律建模,或在不使用 3D 的视觉风格中呈现。
语言。 使用用户的语言进行聊天。每个 AskUserQuestion 都使用英语。 切勿根据姓名推断语言。
快速工作,节省 token
-
一个视频 = 一次会话;状态存储在文件中。恢复:
node <skill-dir>/scripts/state.mjs next、BRIEF.md、PRODUCTION.md的结尾。 -
子智能体类型,列出时:构建器(修复轮次、脚本、语音)使用
dalang-builder,每个裁决使用dalang-checker,事实核查使用dalang-research;否则为通用类型。 -
技能版本:首先说明
next的DALANG v…;绝不使用git。 -
惰性读取:每一步,只读取
state.mjs next --print打印的内容,完整读取,一次调用(步骤 0 也会打印步骤 1;首次approve <n>会打印下一步骤:不需要next轮次,不需要--step提前读取);“需要时查阅” 只在被指示前往时执行。绝不完整读取参考文档、引擎 README 或lessons.md,或重复读取某个章节;对于/hyperframes,只读取所需指南。 -
输出精简:过滤
--json;绝不打印words.json、*.response.json或完整日志;后台输出按字节截断(tail -c 1500)。场景变更是Edit调用,绝不使用sed -i或写入整个文件。 -
场景代码保留在构建器子智能体中。 主智能体绝不编写或读取
src/或assets/*.js(生成的数据除外;风格帧发送给构建器)。引导、每个组、组装以及每个修复轮次都发送给新的构建器(上次报告和路径,其预算在look-build.md/express.md中)。审查者绝不是构建器。 -
图像保留在子智能体中。 主智能体绝不
Read静态图像、条带、工作表、范围或风格帧:子智能体获取路径和next的“给子智能体的命令”,返回文本裁决。例外:style-frames/src/的作者在首次写入之前,会打开每个review/refs-board-<frame>.jpg一次。 -
按任务分配模型,绝不询问:
state.mjs next打印每个步骤的子智能体任务及其模型和努力程度(state.mjs models:所有模型,以及 top/mid/light 的含义)。 -
升级,绝不重复。 失败的任务(红色、不可用、遗留 P0 问题)发送到高一级的新智能体:努力程度(低 → 中 → 高),然后模型(light → mid → top);top 和 high 为上限:遗留的 P0 问题被分类(
hero-asset.md§3)。绝不降级或重复;干净的任务绝不重跑。≤ 3 处复制或计时修复:降一级。记录每次设置。 -
主智能体负责编排,绝不亲自执行具体工作。 你的回合会重新读取会话(约是子智能体的 10 倍);循环(写入 ↔ 检查、拍摄 ↔ 重拍、修复 ↔ 检查)在一个任务内运行(步骤 3–4 也是如此);每次回复都会唤醒你:一个任务运行到其裁决;同时启动的 N 个任务在该消息末尾加上
wait.mjs . --expect N(timeout: 600000):一个回合,一行。Runner(express.mjs/studio.mjs <step>)是一个前台调用(timeout: 600000),当它在约 9 分钟内结束时使用,不进行链式调用或轮询。Agent 提示是任务和路径(≤ 15 行;它通过next --step <n> --sub读取)。检查者写入其裁决文件,构建器写入review/reports/<job>.md;两者都简短回复,绝不重新输入。state.mjs log附加在步骤的命令之后,使用&&,绝不单独使用一个回合。 -
紧凑:
workspace.mjs init设置自动紧凑(200K);在关卡 2–4 时,说明一次/compact是安全的。 -
默认并行。 独立的任务在一条消息中启动,每个智能体处理自己的文件。重型任务(VoxCPM、渲染、检查、快照)单独运行,绝不与模型任务并行;使用
while kill -0 <pid>排队。并行处理:预检 ‖ 主题问题;参考 ‖ 研究任务;关卡 1 后:语音任务 ‖ 资源,绝不能是场景;关卡 2 时:规划器和音乐;第 6 步 Studio 模式:引导,然后所有组;Express 模式:所有组同时启动,无需引导(一个干净的拍摄通过express.mjs after-voice自行通过关卡 1–2;规划器运行express.mjs scaffold .);第 7 步:草稿检查,然后审查者 ‖ 测验 ‖ 设定/现实检查;第 8 步:渲染期间运行POST.md。 -
先廉价后昂贵:拍摄前使用
--sample;仅在{}发生变化时使用--from-response;迭代时使用快照;按轮次批量修复;QC 使用--fps 10 --quality draft;最终渲染一次完成。 -
用户的需求优先:如果某条规则使其无法实现,用一行说明;绝不默默接受。
-
消息简短:说明变更内容、需要决定的事项和链接;等待时,提供下一关卡的时钟时间;步骤执行超过约 2 分钟时提供预估时间。
项目文件(video/<topic-slug>/)
使用 state.mjs log "<step> | <output> | <problems or ->" 记录。该文件夹就是 HyperFrames 项目;从中运行命令。仅编辑 *.tpl.html;node <skill-dir>/scripts/fill_times.mjs src/index.tpl.html index.html 会重新生成 index.html(绝不能手动编辑,不能有第二个根目录 .html)。
步骤
| 步骤 | 执行内容 | 结束标志 | 读取(references/) |
|---|---|---|---|
| 0 设置 | 运行 preflight.mjs,修复其报告的问题,创建项目文件夹 | PRODUCTION.md 创建完成 | brief.md §0 |
| 1 Brief | 首先确定主题,现在提出所有问题 | BRIEF.md 创建完成 | brief.md §1 |
| 2 参考(可选) | 测量制作工艺,绝不复制 | reference-measurements.md 创建完成 | measure-reference.md |
| 3 脚本 | 执行研究、编写、通读任务;approve 1 运行检查脚本 | 关卡 1 | script-voice.md §3 |
| 4 语音 | 执行一个语音任务;after-voice 进行填充,通过关卡 1–2 | 关卡 2 | script-voice.md §4 |
| 5 视觉风格 | 创建 SPEC.md、主角、故事板、资源、风格帧、基准测试 | 关卡 3 | look-build.md §5 |
| 6 构建 | 构建器执行,从 BEATS/WORDS 获取时间,混音音频 | index.html 创建完成,检查无错误 | look-build.md §6 |
| 7 QC | 草稿、检查、条带、审查者、测验、修复轮次 | 关卡 4 | qc.md §7 |
| 8 最终 | 资源检查、高质量渲染、重新检查 | final.mp4、POST.md、报告创建完成 | qc.md §8 |
在每个步骤:关卡通过 state.mjs approve <n> --by agent 进行(按顺序;它会运行关卡检查并拒绝错误;后续编辑过关文件会使其标记为 STALE,直到重新批准);BRIEF.md 规则规定了格式和语言;录制或克隆的声音仅在获得说话者许可后使用;页面仅在 Claude 内置浏览器中打开,绝不使用用户的 Chrome;在 PRODUCTION.md 中记录每一步和每个问题;系列反馈通过 series.mjs note 记录,绝不依赖记忆。
自主模式
如果用户提供了主题后离开,则使用他们已提供的信息,否则:Express 模式;YouTube 16:9,60–90 秒(短片使用 9:16 或 ≤ 60 秒);使用用户的语言;object-studio(Studio 模式下使用 isometric-world);“现代平衡”;面向普通观众;VoiceStudio,默认语音,按照 brief.md 步骤 0 操作(到步骤 4 时未就绪:停止并说明原因)。首先在 PRODUCTION.md 中写入“使用默认值”,记录每个决策,完成影片。发布规则:references/qc.md 中的“用户离开”(如果 audio_qc.mjs 以退出码 2 持续运行,则在交接中说明其名称,绝不通过)。跳过安装提示(记录它们)。绝不编辑已安装的技能。
当出现问题时
grep -n -i '<word>' <skill-dir>/references/lessons.md