diff --git a/apps/ai-game-creator-shell/src-tauri/src/ui_editor/workflow.rs b/apps/ai-game-creator-shell/src-tauri/src/ui_editor/workflow.rs index 62945c75a..8fa8decf5 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/ui_editor/workflow.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/ui_editor/workflow.rs @@ -684,6 +684,17 @@ fn find_page_ui_resource( { return Err(format!("页面 {} 的 UI workflow 资源身份冲突", page.page_id)); } + let generation_kind = asset + .source + .generation_kind + .as_deref() + .ok_or_else(|| format!("页面 {} 的 UI workflow 阶段缺失", page.page_id))?; + if workflow_stage_rank(generation_kind).is_none() { + return Err(format!( + "页面 {} 的 UI workflow 阶段无效:{generation_kind}", + page.page_id + )); + } let mut expected_references = vec![ canonical_resource_id(source), canonical_resource_id(design_asset), @@ -755,7 +766,7 @@ fn ensure_page_ui_resource( prompt: None, model: None, generation_route: None, - generation_kind: Some("ui-workflow".to_string()), + generation_kind: Some("ui-workflow.reference-ready".to_string()), reference_resource_ids: { let mut references = vec![ canonical_resource_id(source), @@ -996,13 +1007,16 @@ fn update_page_manifest_stage(root: &Path, asset_id: &str, stage: &str) -> Resul return Err(format!("UI workflow 资源 {} 类型不匹配", asset_id)); } let next_kind = format!("ui-workflow.{stage}"); - let current_rank = asset + let current_kind = asset .source .generation_kind .as_deref() - .and_then(workflow_stage_rank) - .unwrap_or(0); - let next_rank = workflow_stage_rank(&next_kind).unwrap_or(0); + .ok_or_else(|| format!("UI workflow 资源 {} 阶段缺失", asset_id))?; + let current_rank = workflow_stage_rank(current_kind).ok_or_else(|| { + format!("UI workflow 资源 {} 阶段无效:{current_kind}", asset_id) + })?; + let next_rank = workflow_stage_rank(&next_kind) + .ok_or_else(|| format!("UI workflow 下一阶段无效:{next_kind}"))?; if current_rank >= next_rank { return Ok(false); } diff --git a/docs/【技术方案】UI工作流资源桥接与Runtime执行-2026-08-24.md b/docs/【技术方案】UI工作流资源桥接与Runtime执行-2026-08-24.md index fb0e6ec63..4c25f1d0c 100644 --- a/docs/【技术方案】UI工作流资源桥接与Runtime执行-2026-08-24.md +++ b/docs/【技术方案】UI工作流资源桥接与Runtime执行-2026-08-24.md @@ -55,7 +55,7 @@ ui-workflow.completed 联合请求一次携带全部页面参考图和已登记独立素材;页面参考图最多 4 张,独立素材最多 128 个,页面参考图不占用这 128 个独立素材额度。超过独立素材上限时在发起 Provider 请求前直接失败,不会退回旧的素材 batching 路径。 -`workflow_stage_rank` 不是前端内存状态,也不是 UI 编辑器的步骤索引。它是 Rust workflow 模块里的内部比较函数:读取 UI JSON manifest 资产上持久化的 `source.generationKind`(例如 `ui-workflow.reference-ready`、`ui-workflow.binding-ready`),把阶段映射为数字 rank,用于 `update_page_manifest_stage` 的单调推进保护,避免较早阶段覆盖较晚阶段。真正的阶段值在项目 manifest 中持久化,并随项目 revision 更新;历史 `structure-ready`/`merge-ready` 是否迁移或继续认可属于持久化兼容决策,不由前端会话状态解决。 +`workflow_stage_rank` 不是前端内存状态,也不是 UI 编辑器的步骤索引。它是 Rust workflow 模块里的内部比较函数:读取 UI JSON manifest 资产上持久化的 `source.generationKind`(`ui-workflow.reference-ready`、`ui-workflow.binding-ready`、`ui-workflow.application-ready`、`ui-workflow.completed`),把阶段映射为数字 rank,用于 `update_page_manifest_stage` 的单调推进保护,避免较早阶段覆盖较晚阶段。阶段值在项目 manifest 中持久化,并随项目 revision 更新。当前实现只接受这组现行阶段;缺失或未知阶段直接报错,不做旧值 fallback,也不做迁移。 最终回执写入 `.agent/ui-workflows/.json`,客户端可据此恢复页面清单和最终编辑器路由。