7.4 KiB
原生边身份解阻
16:20 续记:已进一步处理共用分发器造成的全量证据失效,以及复验中发现的 Sandbox 固定样例保存问题,见末节。PartDesign 当前刷新报告为 business-evidence/49fe8f53be6407b93665782d-20260909T080123703164.json,原始通过报告继续保留。
2026-09-09。上一轮 Fillet/Chamfer 的 Invalid edge link 已修复,PartDesign 11 项业务正式通过。此记录更新 partdesign-finishing-delivery.md 中的历史阻塞状态,不删除历史失败证据。
根因与修复
原始最小链是矩形草图 4x8 -> Pad 长度 6 -> Edge1 圆角或倒角 -> Pad 长度 8。草图顶点的名称是 g1v1、g1v2 等,并非 IndexedName 接受的纯字母前缀加数字格式。解析器判定名称无效后仍留下数字后缀。
App::StringHasher::getID(MappedName, ...) 首次插入无条件取 indexed.getIndex(),因此同一字符串首次返回 #5:1,缓存命中却返回 #5。几何没有丢失边,而是身份编码不一致,导致后续原生 DressUp 找不到原引用。
修复只在 src/App/StringHasher.cpp 明确管理经过验证的索引:有效 IndexedName 使用其索引,无效名称使用 0,显式的哈希前缀索引仍保留。没有清空映射、替换 Edge 编号、增加几何算法或重编译 OCCT。后台已有的前缀字节持有改动保留,前缀生命周期并不是本次确认的根因。
原生 trace 现在能展示边、顶点和有限字符串表信息;成功 snapshot 在 trace: true 时返回 mappedEdges。正式用例直接比较基体全部 12 条边在长度修改前后的身份,而非只比较体积。
真实验证
- 发布版 PartDesign 11 项全部通过:
business-evidence/49fe8f53be6407b93665782d-20260909T073459779307.json,总耗时 77.311 秒。 - Fillet 与 Chamfer 的创建、尺寸修改、多边选择、错误回滚、基体长度联动、FCStd/OPFS 保存重开、继续编辑和删除均通过,桌面和手机画布像素、截图及旋转交互通过。
tools/test-partdesign-edge-identity.mjs额外改变基体长度 8/3.5/12/6,每步执行撤销和重做;再改变草图尺寸 5x9、3x6、4x8,最后保存重开并改长度 9。全部原生体积、约束自由度和边身份断言通过,6.119 秒退出。- 补充回归起初断言已通过,但线程池驻留导致 30 秒超时。现在在独立 Node Worker 内运行真实 WASM,文档关闭后统一 terminate 测试 Worker,正常退出;没有用强制成功退出忽略断言。
- 19 项 Facade、发布及几何边界检查通过,5 项构建互斥检查通过。TypeScript、前端发布构建和原生 diff 检查通过。
- 增加两个 C++ StringHasher 单元用例,检查非法索引前缀重复编码和无索引哈希前缀。本机当前 CMake 测试树没有注册这些测试,
ctest -N -R StringHasher显示 0,因此没有把 C++ 单元测试计为已运行;上面的真实 WASM 业务和补充回归已执行。
耗时
| 步骤 | 秒 |
|---|---|
| StringHasher 最后一次编译 | 5.626 |
| 文档诊断适配最后一次编译 | 9.385 |
| 模块最后一次链接 | 26.736 |
| 与后台构建互斥等待,一次 | 35.134 |
| 正式新业务组共享 WASM 加载,一次 | 0.353 |
| Chamfer 原生 / 浏览器业务组 | 3.755 / 11.888 |
| Fillet 原生 / 浏览器业务组 | 3.538 / 11.536 |
| 连续编辑、撤销重做、持久化专项回归 | 6.119 |
| 旧失败命令复用当前证据,各自 | 0.062 / 0.064 |
上述是实际程序步骤,不等于整轮开发时间,也不能重复累加共享加载。源码定位、诊断和编辑发生在 15:12 之后,正式报告生成于 15:34,补充回归和故障对账随后完成。本轮没有暂停后台,也没有重复构建 OCCT。
两条原始失败 f66c8f92aa533df11704、8e0f8b40d1f786372d36 已用原命令成功结果和现有故障关闭流程确认 resolved,历史错误保留。相同证据指纹有效时直接复用,不再重开这个已修问题。
续接边界
直接复用已完成的 PartDesign 文档、草图、Pad/Pocket、Revolution/Groove、Fillet/Chamfer。下一轮继续其它真实特征和文件业务。共用源码修复已经进入当前 PartDesign 产物;其它独立构建目录或模块按其实际受影响业务增量采用,未宣称所有 WASM 已重新链接。
旧版本已经写入错误映射的任意历史文件、任意拓扑改变后的自动修复不在本次证明范围内,不能按 Edge 编号自动重绑定。全项目仍以当前审计和故障对账为准,以上通过不代表整体移植完成。
避免全量失效
收口时后台修改 TechDraw 适配,但代码位于 desktop-command-dispatcher.ts,使所有模块旧指纹失效,进度曾短暂显示 0。没有删除功能,也没有修改通过标记掩盖失效。
已把 TechDraw 的参数准备、容器路由策略和 native 响应校验移到 web/src/techdraw-desktop-adapter.ts,共用分发器只调用模块适配。按原 AST 提取并保持原行为,五项适配/分发回归通过。TechDraw 文件继续纳入自身源码指纹,Web 界面也跟踪模块适配依赖;tools/test_desktop_adapter_scope.py 证明模块适配变化不影响无关 Part,真正的共用分发器变化仍使相关指纹失效,没有放宽有效证据规则。
直接批量复验 22 个模块的 95 项既有结果,进程耗时合计 181.933 秒,没有重做实现或重编译内核。Part 和 PartDesign 浏览器组占主要测试时间;TechDraw 在后台已经取得新证据,直接复用。Sandbox 保存发现实际失败后另行修复,未将失败算作成功。BIM/Start 在后台继续变更时,仅刷新对应模块的失效结果。
一项旧调度测试仍要求模块切换先插入历史对账,已更新为现行 delivery-workflow-first-v3 的业务优先预期;没有改变调度器回到旧顺序。15 项故障对账测试、10 项业务恢复测试、16 项验收优先级测试以及适配作用域测试通过。
Sandbox 当前文档保存
复验暴露旧 fc_web_sandbox_save_reopen 只创建整数 42 的临时样例,且以“全局文档为空”判断资源释放,不能与保留用户文档的创建流程组合。旧入口保留作历史探针,不再用于业务完成证明。
新增同一现有 Sandbox WASM 中的 sandbox.saveReopen 当前文档分支,复用 FreeCAD FCStd 保存/恢复,保存多个对象及其实际整数值,恢复到独立命名文档。sandbox-document-save-facade.ts 做输入、结果身份和类型检查;创建、保存、继续编辑通过 sandbox.worker.ts 共享同一原生应用实例。无效路径等业务错误保留请求 ID,不清空健康 Worker。生成路由已同步。
验收使用 17、73、99、-2147483648 等值,多个源文档、两个对象、独立重开、修改后再保存、重复目标拒绝、无效输入恢复,并执行真实 Worker 消息处理器(仅加载边界注入公开 WASM)。两项 1.897 秒通过:business-evidence/6f3f2a7c6162d761539896ea-20260909T081842690432.json。路由检查使用 TypeScript AST 提取真实路由数据和函数,不依赖旧生成文件的字符串格式。
Sandbox 本轮只增量构建其已有模块,未新增 WASM 或重编译 OCCT;不宣称其浏览器 UI、OPFS 或混合非 Sandbox 对象已经验收。全项目在 16:20 的有效结果为 117/1504,Start 正由后台修改;后续以实时审计为准。