Files
Endoleap/VALIDATION.md

90 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Canvas V2 验收记录(2026-11-06)
## 前端检查
- `npm run typecheck` 通过。
- `node --experimental-strip-types --test tests/*.test.mjs`:69 项测试通过,覆盖既有行为、V2 无损往返、端口方向与曲线字段校验、投影与逆变换、局部/远端三方合并、草稿兼容、八向 Shift 等比、LCA 连接计划和父子共同拖动不重复位移。
- `CANVAS_UI_TOOLS=/private/tmp/endoleap-ui-check node tests/canvas-ui-check.mjs`:真实 React Flow + DOM 事件回归通过,使用临时安装的 esbuild/jsdom,不访问浏览器。
- DOM 覆盖:旋转与撤销重做、三图标标签切换、八向手柄、连线选择/曲线点/marker/动画;子画布独立读取与保存、收起/展开、创建及撤销重做;模型按输出类型过滤、文本传播、图片原节点回写、取消与生成期间保留几何。
- 新跨图连接以实际 Handle 鼠标事件触发,验证能力门槛、最低共同祖先、准确的所有参与版本,以及已经提交但丢失响应后的相同 body/key 重试;不会重复创建端口或边。
- API 冒烟覆盖 V2 Accept/If-Match/Idempotency-Key、子图/连接/运行命令白名单、事件分页参数、带 Cookie 的图片二进制响应、MIME 限制、multipart 上传、原有 OAuth/会话/同源校验和 5 MiB 限制。
- 隔离生产构建 `npm run build -- --webpack` 及最终 `node tests/api-smoke.mjs` 均通过;构建在临时副本执行,不改变正在使用的开发服务器产物。
## 后端与测试画布证据边界
用户交付 Core `b4e537b` 部署、ECS CI #912/#913,以及 `/Users/zzyang/foundry-canvas-v2-migration-summary.json`:指定父画布版本 209→210,1 个真实子画布、2 个显式成员,11 个节点和 2 条边保留;重新读取和幂等验证通过。
用户提供的隔离后端真实模型验收包括文本生成和 PNG 图片产物;本轮前端没有再次调用线上模型、修改测试画布或重复迁移。模型 ID 在运行时读取,不硬编码验收 ID。
新增 connections 扩展已对照用户提供的接口说明和本机 Core `07fd678` 源码实现;主线合并为 `630ed42`。生产是否可调用以 capabilities.subgraphs.connections=true 及后端部署确认作为门槛,不把文档或合并本身当作已部署。
## 限制和交付状态
- 按用户约定未访问项目浏览器,未进行视觉布局、真实拖动手感与真实登录会话的浏览器验收。
- 子图关系备份不能作为普通单图快照导入其他画布;导出包含完整 owner 文档集合,避免仅备份父图或重复保存投影。
- 网络未知结果保留请求并暂停编辑;普通版本冲突保留本地草稿,不强推覆盖。
- Headless 库尚未创建,提取方案已改写在本地忽略的 docs/HEADLESS_CANVAS_API_DRAFT.md;已替代的分区/元素/后端需求文档已清理。会话策略文档仍保留。
- 原有 next-env.d.ts、pnpm-lock.yaml 和 pnpm-workspace.yaml 不属于本次交付,保留未提交。
## 侧栏目录与加载性能修正
- 侧栏通过 include_subgraphs=true 和完整分页展示嵌套子画布;支持展开/收起、活动路径、搜索保留祖先,关系事务完成后刷新。
- 空闲 AI 查询降至 30 秒、任务期间 1.2 秒;隐藏标签页暂停,返回或本地命令后唤醒;空响应不重渲染。
- 编辑器拆成动态模块,与元数据/快照并行加载;成功 Canvas GET 代理采用流式转发。
- 实际证据、性能边界及未执行的公网/浏览器验收见 PERFORMANCE.md;不将本地模拟测试当作公网提速实测。
- 本次最终检查通过:TypeScript、73 项单元测试、React Flow DOM 全量回归、隔离 Webpack 生产构建及 API 冒烟(含上游响应体暂停时首段透传、目录分页参数)。
## 传输中断与只读打开修正
- 大快照分离响应头、正文总时限和正文空闲时限;加入仅含时间/计数的传输、保存和 dirty 字段诊断。
- JSON 读取失败不再吞成 null;区分传输中断、不可解析响应和真实快照校验失败。
- 内容指纹忽略单独的 viewport 变化;视角保存在本机,初始化与缩放不会上传快照。浏览器日志已确认原误保存字段仅为 viewport。
- 新增慢正文、空闲超时、请求取消、失败 200、204、视口浮点与真实内容保存的测试;DOM 覆盖父/子图打开与缩放零 PATCH。
- 用户完整读取已成功(父图 477,385 字节),但链路样本仍有 2.66–32.75 秒波动;ECS/公网对照尚待补充,详见 PERFORMANCE.md。
## 附件与预览修正
- 新图片使用受管附件;旧图仅在用户明确点击后迁移,字节保持原样,快照不保存预览地址。
- 单元测试增加字节一致性、重复图片去重、幂等重试、失败不替换、V1 兼容和渲染 URL 分离;共 84 项通过。
- DOM 回归确认只读打开/缩放零 PATCH、显式迁移一次上传、位置和边不变、画布使用预览而快照保存原图引用;原有 AI/子图/连线回归通过。
- 同步 TCP/数据库证据及隐私边界见 PERFORMANCE.md。Core PR #15 已由用户合并为 b2ae48e;分支/PR CI #936/#937、主线检查 #940 和部署 #941 全部成功。用户已明确执行迁移与重开,生产验收完成:父图版本 252→253,两张原图 SHA-256 一致,节点/内容/边哈希一致;数据库 JSON 477,397→3,708 字节。成功重开请求 219.6ms(正文 1.3ms),独立图片 551.2/1,354.9ms,随后无新增保存且版本保持 253。另一次零正文取消请求与网络波动限制见 PERFORMANCE.md。
- 最终前端检查:TypeScript、84 项测试、完整 DOM 回归、隔离 Webpack 构建和 API 冒烟均通过(包括 15.2 秒慢正文、原图/预览参数及响应头)。
- 最后补充:图片按需加载/异步解码;优化提示保持到版本保存确认后才消失,并阻止与新图片上传重叠。延迟保存的 DOM 回归和最终隔离构建通过。
## 临时迁移功能清理
指定生产画布完成迁移验收后,按用户要求移除“优化图片加载”入口、专用 Hook 状态和 Base64 迁移辅助函数。保留正常附件上传、原图引用及独立预览。类型检查、4 项附件单元测试、完整 DOM 回归通过;DOM 覆盖旧内嵌图片无迁移按钮/无后台上传、只读打开零 PATCH,以及既有 AI/连线/子图功能。此次删除变更未重复执行生产构建;此前隔离构建结果保留为历史记录。
## 跨分区同步优化
- TypeScript 和 83 项单元测试通过。新增 DOM/Hook 场景覆盖:原子成员移动一次 POST/无前置 PATCH、延迟响应期间编辑和拖动其他节点、快照合并保留编辑、撤销/重做保留单一归属、丢失响应以相同 body/key 重试、412 重读版本后新命令重试、连续跨分区移动排队、旧后端兼容。
- 实际 ReactFlow DOM 手势验证 icon 跨分区后出现元素旁同步提示,无整屏同步遮罩;其他元素可继续拖动,服务器确认后位置不回退。既有 AI、连线、框、图片回归通过。无浏览器访问(沿用用户要求)。
- 最终隔离生产构建通过。Core push #946、PR #947、主线 #949、部署 #950 均成功,包含 Go 测试/构建、数据库迁移和 PostgreSQL 集成测试;PR #16 已合并为 2207c85 并部署。Core 不在本机编译。真实 icon 拖放验收仍待用户操作后的记录核对,不将发布成功当作实际性能实测。
## 慢能力响应与首次上传
生产复核发现 capabilities 请求约 1,989ms,原先 2 秒客户端截止可能误将慢响应缓存为不支持。已删除该短截止,网络错误清除缓存并重试;只有成功响应明确未声明能力才走旧流程。DOM 回归增加 2.1 秒能力响应、预取失败后重试的场景,均保持原子移动、无前置 PATCH。
上传 DOM 回归覆盖:网络未确认前本地图片已显示、可添加其他内容、快照没有 blob URL、原始附件引用与 assetId 正确、远端预览加载后释放本地 URL、失败保留文件、同键重试只创建一个节点、取消/卸载清理与原图比例。TypeScript、83 项单元测试与隔离生产构建通过。生产新上传的交互体验及修正后的能力协商仍需用户刷新后实测。
## 上传期间的真实本地节点
改为在选图时创建可编辑的本地 CanvasNode,上传确认只更新 src/assetId,并同步修正本地撤销记录,不新增无意义的撤销步骤。传输过滤临时节点与关联边,写入基线使用实际发送的干净快照。
- 84 项单元测试通过,新增上传节点/关联边不会进入网络快照、其他内容仍能保存、附件可用后正常保存的覆盖。
- DOM/Hook 回归通过:上传期间拖动/缩放/改名在确认后保留;确认前删除不会被重新插入;删除可撤销;尺寸初始化与引用补齐不消耗撤销;本地跨分区移动与复合撤销、文件确认到当前所属画布;已持久化后的归属撤销走真实事务。
- 并发回归通过:版本号型响应的重新读取、包含重复 parent 的事务快照,都保留本地上传节点;其他事务与附件完成同时发生不会覆盖新图片。AI 在文件上传完成后可执行,编辑无需等待。
- 最终 TypeScript、84 项单元测试、完整 DOM 回归和隔离生产构建均通过;未访问用户浏览器,不将 DOM 测试描述为用户已完成浏览器验收。
## Headless 方案与应用提示依赖
本地忽略的 `docs/HEADLESS_CANVAS_API_DRAFT.md` 已重写为方案:同步 command/working document 与独立 runtime、operation ledger、ACK 基线分离;提供 component/feature 组合、API A/B/C、八个 viewport slot、实例 mode、混合选择、文件恢复、幂等与撤销设计。仅为待选择方案,没有提取或发布 npm 包,也没有实现 IndexedDB/outbox。特别区分普通 CAS 快照 PATCH 与有 Idempotency-Key 的事务,避免把重试后的 412 错判为原请求零写入。
实际安装 Sonner 2.0.8、Radix Tooltip 1.4.1,并同步 `package-lock.json`。根布局挂应用 provider,固定通知 ID 避免重复;图标按钮保留实际 button/ref 与原尺寸。通用错误/归属完成使用应用通知,原保存冲突、失败上传和重试入口保留。
- TypeScript、84 项单元测试与完整 DOM 回归通过;新增真实依赖场景覆盖独立按钮原生说明、键盘 tooltip/Escape、ref/DOM 结构、点击、通知更新去重/关闭,以及 provider 内的分区完成、非法文件提示和继续编辑。
- 在临时副本执行 Webpack 生产构建和 API 冒烟,均通过;未改变当前开发服务的 `.next`,未访问用户浏览器或生产画布。DOM 布局检查不替代真实浏览器视觉验收。
- 保留用户的 `next-env.d.ts`、未跟踪的 pnpm lock/workspace 文件;docs 继续忽略,不强制跟踪。