phase3-finalize.md 6.0 KB

阶段三 · 检查收尾 (主 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-<slug>.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-<slug>.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 视频" ❌ (是 <描述> 前缀格式); "提示词内容: 一个中景特写的年轻亚洲女性, 坐在低光的卧室床上, 湿长发素颜雀斑, 缓慢举手机..." ✓ (文本直接写); "视频内容: <AI 生成的 10s 视频, 床上女性举手机场景, 含 AI generated 水印>" ✓ (整段括起)
目的列以结构化元素为骨架 简短自然语言 (≤ 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 <path> 校验; 不命中标 unmatched 待人工审 /视觉/人物 ❌ (缺 L1 顶层)
指令归类正确 工具组的 4 个子列各司其职: 指令=directive 文本片段; 配置=工具运行参数 (采样/cfg/aspect/...); 运行=caller-side decorator (@采样 等); 备注=其他结构化字段没能包含的实现方法信息 (经验性招法 / 替代 variant / 选型理由 / 适用条件 等). data 端用单一 kind ('memo', txt). 不混 把采样参数放到 指令 列 ❌; 备注里写"原文: ..."这种溯源 ❌ (备注是工艺信息, 非引文)