让设计 Agent 先给差异再改页面:确认面板的四个状态
让Agent一次修改十个组件真正困难的未必是“确认”按钮放在哪里而是用户确认的范围有没有在点击之前变化。预览看的是圆角执行时却多改了颜色这种错位再配上流畅动画也只是更难发现。10月Figma Specs把设计意图、引用与协作讨论放到同一画布适合用来说明变更范围。这里进一步提出一条前端约束确认针对的是一份具体差异清单不是某个可能继续变化的任务。先给出可核对的差异清单应显示组件、属性、前值与后值并允许打开相应状态。数量只能帮助估计影响面不能替代差异内容。模型生成尚未结束时可以显示建议草稿但不要把尚会变化的内容直接送进应用阶段。“建议—待确认—应用中—结果”是四个交互阶段。结果也不只有成功部分失败、状态未知和已应用应逐项列出。下面内存样例让一项故意失败用来检查显示逻辑不模拟真实系统收益。确认凭据绑定这份清单保存为confirm.mjs后用Node运行。签名只是固定结构的规范化字符串用于本地内容比较它不是安全签名也不承担鉴权。import assert from node:assert/strict; function signature(ops){ const idsops.map(oo.id); if(new Set(ids).size!ids.length)throw new Error(duplicate operation); return JSON.stringify(ops.map(({id,component,key,before,after}) [id,component,key,before,after]).sort((a,b)a[0].localeCompare(b[0]))); } async function applyConfirmed(ops, receipt, applyOne){ if(!receipt.confirmed||receipt.signature!signature(ops)) throw new Error(confirm this exact change list); const result[]; for(const op of ops){ try{await applyOne(op);result.push({id:op.id,status:applied});} catch(error){result.push({id:op.id,status:failed,message:error.message});} } return result; } const ops[ {id:a,component:card,key:radius,before:4,after:8}, {id:b,component:button,key:gap,before:8,after:12} ]; const receipt{confirmed:true,signature:signature(ops)}; let calls0; const resultawait applyConfirmed(ops,receipt,async op{ calls;if(op.idb)throw new Error(teaching failure); }); assert.deepEqual(result.map(xx.status),[applied,failed]); await assert.rejects(()applyConfirmed( [{...ops[0],after:16},ops[1]],receipt,async(){}),/exact change/); assert.equal(calls,2); assert.equal(result[0].id,a); console.log(PASS: exact-list confirmation and per-operation results);为了保持示例集中这里把所有抛出错误记为failed。真实适配器遇到“请求已发出但结果查不到”时应给unknown不能因为本地超时就断言没有修改。也不能把部分成功自动回滚成“全部未应用”那会掩盖实际产物。前值比较应由有权写入的系统原子完成。前端凭据只能防止界面在用户不知情时更换清单不能保证服务器没有并发写入。若应用阶段出现冲突回到该组件的当前版本重新审阅。动效该说明阶段不该代替结果确认后按钮可以转为“正在应用”但动画结束不等于写入完成。结果区域保留每项ID、状态与打开入口已应用项和失败项都能找回。重复点击应明确说明当前阶段不让用户因为没有反馈而不断确认。撤销也要说明边界是只撤销已成功项还是准备一份新的反向差异受影响对象已经再变更时应展示冲突不能把旧快照无条件覆盖回去。图只描述界面阶段及分项结果不代表存在一个跨多个组件的后端事务也不暗示失败会自动重试。确认面板应该让设计者知道“这次同意了什么”结果面板则回答“最终发生了什么”。把这两个问题分清反馈动画才有可信的内容可以表达。验证范围与资料本地使用 v26.3.0 检查上述示例。纯 JavaScript 示例已在 Node 权限隔离模式执行断言通过。只测试内存差异清单和手写失败回调没有连接Figma、应用真实补丁或验证分布式原子性。以下发布日期或版本日期与访问日期分开记录24—31日的新消息须发稿前再核对。Design together with code layers on the canvas2026-10-15发布。Introducing Specs: Markdown as a medium2026-10-15发布。Using the Web Animations API2025-11-07最后修改。Web Animations 官方草案2023-06-05W3C Working Draft。