diff --git a/docs/technical/【技术方案】UI编辑器Agent工具化重写-2026-09-23.md b/docs/technical/【技术方案】UI编辑器Agent工具化重写-2026-09-23.md index b2d6c8c77..a7ecbddf9 100644 --- a/docs/technical/【技术方案】UI编辑器Agent工具化重写-2026-09-23.md +++ b/docs/technical/【技术方案】UI编辑器Agent工具化重写-2026-09-23.md @@ -39,15 +39,24 @@ 不再有合并、组件绑定与页面级 profile/finalize 阶段;`recognize` 之前不做任何前置发现。 +`NeedReview` 与 `component_status` 的清理是 `separation` DTO 的一部分:问题节点由 DTO 的 +`problematic_nodes` 给出,编排阶段统一回写,重放时不需要模型再判一次;文案与判据镜像 +前端 `features/ui-editor/separationStatus.ts`。 + ## 崩溃恢复 检查点是文档旁一条追加式 JSONL 日志,方案与被否方案见 [ADR:UI 工作流检查点用追加式 JSONL 日志](../adr/【ADR】UI工作流检查点用追加式JSONL日志-2026-09-23.md)。 - 位置:`ui/.<文档文件名去扩展名>-workflow.jsonl`,与文档同级,不进 manifest、不推进项目 revision。 -- 行格式:`run`(原始 State 快照)、`recognize`(DTO)、`separate`(DTO)、`write-back`(新 revision);行内另带 `at` 时间戳。 +- 行格式:`run`(原始 State 快照 + 起始 revision)、`recognize`(DTO)、`separate`(DTO)、`write-back`(新 revision)、`outdated`(本轮作废原因);行内另带 `at` 时间戳。 - 判据只有一条:「本步有没有对应的行」。每行必须一次性原子追加,崩溃留下的半行一律视为该步未完成。 -- 轮次:一轮以 `run` 行开头,以该轮第一行 `write-back` 结束;恢复只针对最后一个没有 `write-back` 的轮次。 +- 轮次:一轮以 `run` 行开头,以该轮第一行 `write-back` 或 `outdated` 结束;只有最后一轮没有结束行时才需要恢复。`outdated` 只作废未完成的那一轮,不删除既有行。 +- 半行:追加前先把日志截断到最后一个换行,丢掉崩溃留下的半行,避免它夹在日志中间。 +- 漂移:文档在轮次中途被改动(当前 State 与 `run` 行快照不一致)时,追加一行 `outdated` 并**返回错误**,不在同一次调用里自动重开新一轮;下一次调用看到 `outdated` 才从头开新一轮,且以当前文档为基准。 +- 写回幂等:`save` 成功但 `write-back` 行没追加时,重放会重建出同一份目标 State,此时按「目标 State 与文档当前 State 相等」判定为已写完,直接补 `write-back` 行并返回成功。这条判据成立的前提是工作流这条路不产生随机身份:识别树的根节点 id 来自 DTO,切图资源 id 走 manifest 的 by-path 复用。 +- 切图资源不回滚:切分产出的图片与已登记资源在失败后保留,重放靠 by-path 复用接上,不做回滚清理。 - 切分 op 内部的细粒度恢复仍由 `SeparationState` 承担(`ui-editor-separation-state.v2` sidecar),日志只记录工作流层面的步骤完成,不复制它的进度。 +- 不引入跨语言 fixture 比对:镜像的四个 seam 都是简单变换,靠同语义实现与各自单测覆盖,不为它们额外维护一套 golden。 ## 模块布局