#### 阶段三 · 检查收尾 (主 Agent 调脚本) | 子步 | 任务 | 备注 | |------|------|------| | **3.1** | **lint + 渲染** — 跑两个命令: (a) `python spec/tools/lint-case.py --workflow outputs/case-N/workflow.json --case-id N` 校 type 完整性 + 自动 record 新 type 到 `spec/taxonomy/type_suggestions.md`; (b) `python spec/tools/render-case.py --workflow outputs/case-N/workflow.json --source-input input/case-N.json --page-title "Case N · 主题" --case-id N --out outputs/case-N/case-N-.html` 渲染 HTML (内存组装 case_data, **不落盘 case_data.json**) | lint 失败 → 主 Agent 看 stdout 决定回阶段二哪步重 Edit workflow.json | | **3.2** | **目的列填写** — **Edit workflow.json**, per step 加 `intent` 字段 (≤ 20 字自然语言). 跨 step 一次性填 (差异化需要跨步视图). 以已有结构化元素 (其他列) 作 `{kind:value}` token, 允许调整语序 + 少量胶水. 合法 kind: `{effect/via/act/control/in-type/out-type/in-sub/out-sub/in-form/out-form}`. **严禁变量名** (no `{in:X}` / `{out:X}`). **严禁引用特性列** (`{feature:X}` 不允许). **严禁 "X: Y → Z" 这种伪代码结构** | 不可子 Agent 化, 因为差异化判断需要跨步视图 | | **3.3** | **.md 落盘** — Write `outputs/case-N/case-N-.md` (DSL 文本版, 按 md-structure §11 结构) | Agent 写, 不脚本化 | ##### 阶段三 · lint 检查清单 最终产物必须满足以下规则, 任一失败 → 回阶段一对应步骤修: | 检查项 | 规则 | 失败示例 | |------|------|------| | **命名归一** | 同一概念在不同 step 用同一变量名 | "正向提示词" vs "提示词.正向" 混用 | | **类型一致** | 同名变量在不同 step 的 type 一致 | s1 的 `主角图: 参考图` 但 s5 写成 `主角图: 分镜图` | | **引用闭合** | 每个 input 能 trace 到上游 output / declare / 字面量 | 引用了 `s2.角色图` 但 s2 实际 output 是 `s2.主角图` | | **容器索引合法** | `[i]/[i+1]/[-1]` 在循环或合理位置内 | 在非 loop 内引用 `[i]` | | **值 vs 来源分离** | `值` 列**不能**只放 `← sN.x` 这种来源引用 (来源信息归 `来源` 列). `值` 必须是数据本身的描述/字面量 (允许 "(同上游) ...short excerpt..." 形式) | 值=`← s1.正向提示词` ❌ → 值=`(同上游) "中景特写..."` + 来源=`← s1.正向提示词` ✓ | | **值不允许截断** | `值` 列即使内容长, 也要 CSS 多行换行完整展示, 不允许 `text-overflow: ellipsis` / `overflow: hidden` 截断. 引文带省略号 ("...") 必须是源材料本身就截断, 不是 UI 截断 | UI 强制裁掉 prompt 文本结尾 ❌ | | **值是内容本身, 非元描述** | `值` 列写**数据本身的内容**, 不写 "[图 N 显示]" / "原文: ..." 等溯源/元数据. **文本数据** (提示词/分镜脚本/描述 等) 直接写完整 prose 内容 (生动详尽, 不加任何包裹标记); **非文本数据** (视频/图像/音频) 无法在 cell 中直接嵌入, 用 `<整段描述用尖括号括起>` 标识 (注意: 是**整段**包在 `<...>` 内, 不是 `<描述>` 前缀). **值列写数据内容本身, 不写 `[视频]/[图像]` 这种载体标签** | "`[图 2 显示] 含 ...`" ❌; "`<描述> AI 生成 10s 视频`" ❌ (是 `<描述>` 前缀格式); "提示词内容: `一个中景特写的年轻亚洲女性, 坐在低光的卧室床上, 湿长发素颜雀斑, 缓慢举手机...`" ✓ (文本直接写); "视频内容: ``" ✓ (整段括起) | | **目的列以结构化元素为骨架** | 简短自然语言 (≤ 20 字). **尽量直接使用已有的结构化元素** (其他列的值) 作为 token; 允许少量胶水文字 (动词 / 连接词) 串联. 多个同列值要独立 token, 不用胶水词合并. 合法 kind: `{effect/via/act/control/in-type/out-type/in-sub/out-sub/in-form/out-form}` (in-/out- 区分输入输出, 自动染色). 严禁变量名 token; 严禁引用特性 (`{feature:X}` ❌); 严禁 dataflow 公式 | "`{act:反推}: {form:景别} → {form:纪实}`" ❌ (公式); "得到正负 `{out-type:提示词}`" ❌ (胶水词合并); "得到 `{out-type:提示词}` 和 `{out-type:负向提示词}`" ✓ (2 个独立 token) | | **作用 / 动作 命中字典树** | `作用` 必须是 §A.1 L3 叶子; `动作` 必须是 §A.2 树路径 | `作用:开端` ❌ (不在树里) | | **类型命中字典树或 extends** | `类型` chip 必须是 §A.3 叶子, 或 case 自定义但 `extends` 一个叶子 | `类型:小品` ❌ → 需补 `extends 视频成品` | | **case-specific type 完整性** (调 `spec/tools/lint-case.py` 自动校验) | 跑 `python spec/tools/lint-case.py --workflow outputs/case-N/workflow.json --case-id N` — 输出"type 完整性: N 个提示" 时, 表示有 IO 用了 case-specific type 但该 procedure 的 type_registry 漏注册 / 缺 extends / 缺 desc. 工具同时会把所有 procedure.type_registry 里的 case-specific entry 自动 record 到 `spec/taxonomy/type_suggestions.md`. Agent 看 stdout 决定是否回 Phase 2 Edit workflow.json 补 type_registry | lint-case 输出 `[p1-simple] step[1].outputs[0].type='主角图' 是 case-specific 但 type_registry 没注册` → 回 Phase 2 Edit workflow.json 在 p1-simple.type_registry 加 `主角图: {extends:"参考图", desc:"..."}`, 重跑 lint | | **实质·形式 路径合法** | 调 `spec/tools/taxonomy-lookup.py --validate ` 校验; 不命中标 `unmatched` 待人工审 | `/视觉/人物` ❌ (缺 L1 顶层) | | **指令归类正确** | 工具组的 4 个子列各司其职: `指令`=directive 文本片段; `配置`=工具运行参数 (采样/cfg/aspect/...); `运行`=caller-side decorator (`@采样` 等); `备注`=**其他结构化字段没能包含的实现方法信息** (经验性招法 / 替代 variant / 选型理由 / 适用条件 等). data 端用单一 kind `('memo', txt)`. 不混 | 把采样参数放到 `指令` 列 ❌; 备注里写"原文: ..."这种溯源 ❌ (备注是工艺信息, 非引文) | ---