## 第三阶段 · 检查 + 渲染 > 前两阶段已经把内容都填进了 `workflow.json`,这里只做两件事:跑检查、渲染出网页。**产物只有网页(HTML)。** | 小步 | 做什么 | |------|------| | **3.1 检查 + 渲染** | 跑两个脚本:① `lint-case.py` 检查类型完整性、内容有没有偷懒写引用,并自动登记新类型;② `render-case.py` 渲染出网页(脚本在内存里组装数据,不另存中间文件)。检查报问题就回对应阶段改。 | ```bash python spec/tools/lint-case.py --workflow outputs/case-N/workflow.json --case-id N python spec/tools/render-case.py --workflow outputs/case-N/workflow.json \ --source-input input/case-N-raw.json --page-title "Case N · 主题" --case-id N \ --out outputs/case-N/case-N-.html ``` ### 收尾检查清单 下面每条都要过,过不去就回对应步骤改: | 检查 | 规则 | 反面例子 | |------|------|------| | **输出编号唯一** | 每个输出都有编号,且工序内不重复 | 两个输出都叫 `s2o1` | | **数据流连得上** | 每个输入的"来源"(`← 某编号`)都能找到已存在的输出编号(或 `← 工序输入`、字面量) | 引用了 `← s2o9` 但根本没有这个编号 | | **类型对得上** | 输入的类型,和它"来源"指向的那个输出的类型一致 | 输入写 `分镜图` 但来源那个输出是 `参考图` | | **循环索引合理** | `[i]`/`[-1]` 用在循环里或合理位置 | 不是循环却用了 `[i]` | | **"值"写真内容** | "值"写数据本身(文字写全文;图片视频用 `<整段描述>`);不写 `← sN` 引用、不写 `[图N显示]` 这种说明 | 值 = `← s1o1`;值 = `<描述>开头的` | | **作用/动作命中词表** | 作用是 9 个标准词之一;动作是动作词表里的路径 | 作用写成"开端"(词表里没有) | | **类型命中词表或挂靠** | 类型是词表里的词,或自造但在本工序 `type_registry` 里写了"算作"哪个标准词 | 类型写"小品"却没说挂靠 `视频成品` | | **自造类型登记齐全**(脚本自动查) | 跑 `lint-case.py`,若提示"类型完整性 N 个问题",说明有自造类型没在 `type_registry` 登记 / 缺挂靠 / 缺说明 → 回去补 | `s1 输出的 type='主角图' 是自造但没登记` | | **"目的"列规范** | ≤25 字一句话;标记取自本行真实有的值;合法类别 5 个;别写成公式 | `{act:反推}: {in-type:视频} → {out-type:提示词}`(写成公式了) |