Files
Web_FreeCAD_Bitbybit/docs/continuation-status.zh-CN.md

286 KiB
Raw Blame History

Web FreeCAD 接续执行状态

更新时间2026-08-03FreeCAD 1.1.1 原生黄金 oracle 里程碑)

1. 当前目标

按 FreeCAD 1.1.1 全功能对标方案持续推进 F0-F9 阶段门,完成实现、测试、兼容矩阵、发布门禁并同步云仓库。当前仍是 experimental 核心 Facade/OCCT 阶段,不能宣称已达到 FreeCAD 全功能兼容。

2. 仓库状态

  • 分支:main
  • 云仓库:http://154.8.160.151:3000/wangdequan/Web_FreeCAD_Bitbybit.git
  • 最近已推送里程碑:81fcc69 docs: record multi-transform milestone
  • 最近已推送里程碑的完整门禁:./npmw run verify 通过
  • 当前原生 oracle 里程碑验证FreeCAD 1.1.1 源码构建成功5/5 Part 黄金回放、./npmw run verify、diff/JSON 校验全部通过
  • 生产构建:通过
  • 本地开发地址:http://127.0.0.1:5173/
  • 兼容真值表:config/compatibility-matrix.json
  • 总体方案:docs/freecad-full-parity-plan.zh-CN.md

3. 本轮已完成并推送

  1. 重计算根因诊断、修复分支重算与诊断树。
  2. Linear Pattern、Polar Pattern 和基础 Hole 的 experimental OCCT 执行链路。
  3. 稳定拓扑签名、版本化 TopoRef、迁移、PropertyLinkSub 与保守拓扑历史回退。
  4. Sketcher 版本化 solver provider 协议、能力探测、取消/过期 generation 隔离和回放合同。
  5. 椭圆/B-spline 领域模型;基础 TypeScript solver 对未支持曲线返回明确诊断。
  6. 外部草图几何、稳定 TopoRef、持久化与 topo-ref DAG 依赖边。
  7. Vector、Placement、LinkList/StringList 结构化属性合同Placement 深拷贝、校验、撤销、持久化和 UI 编辑器。
  8. 对象级 Placement 重算:基本体/特征 Shape 生成后执行平移与轴角旋转;恒等变换跳过额外 Shape变换失败释放临时 Shape 并保留上一次有效缓存;保存后恢复的 Placement 可再次驱动重算。
  9. TSN generation 写回:重算成功后采集面/边/点签名快照与保守历史;迁移 LinkSub/草图外部几何歧义或删除引用标脏所有者并生成可定位诊断schema v6 保存对象拓扑快照。
  10. TopoRef 候选替换事务:属性面板/诊断页从源对象当前同 kind 拓扑候选中原子替换 LinkSub 或外部几何引用,重建 DAG、标脏重算并支持 Undo/Redo。
  11. Mirrored whole-shapeFacade 暴露 OCCT 平面法向镜像PartDesign Task 支持 XY/XZ/YZ 原点平面与可选 Fuse重算释放 union 临时副本并写回 Shape/拓扑 generation。
  12. MultiTransform whole-shape新增结构化有序 Linear/Polar/Mirrored 步骤属性、Task/属性编辑器、最多 6 步和 100 实例校验;重算按顺序组合全部实例,失败与成功均释放中间 Shape并保留最近有效缓存。

相关提交按新到旧:

  • 293cff6 structured placement properties
  • a8f902c stable sketch external geometry
  • 6786261 advanced sketch curves
  • e0b4817 versioned sketch solver protocol
  • 4d94109 conservative topology history fallback
  • d3d88b2 LinkSub topology references
  • 9def470 topology reference migration
  • 1ed3527 basic hole
  • ce3b81c polar pattern
  • 8995b90 linear pattern
  • aeafc6c recompute diagnostic repair tree

4. 已确认限制

  • 锁定的 FreeCAD 1.1.1 C++ 源码可由脚本获取到忽略目录并完成无界面 Part 原生构建;尚无 FreeCAD/planegcs Emscripten 工程或 planegcs WASM 产物,SK-03 不能标记完成。现有 typescript-basic solver 仅用于协议与基础模型验证。
  • Pattern 与 MultiTransform 当前复制整个 Shape不是 FreeCAD 局部特征历史。
  • Hole 固定原点/法向,尚无面定位、沉孔、锪孔、螺纹和完整孔标准。
  • 拓扑历史来自签名保守回退,不是 OCCT/FreeCAD 原生 Generated/Modified/Deleted 历史。
  • Placement 已进入文档属性,并接入 Facade 的对象级 Shape 重算;尚未完整映射到 Body/Tip、Support、AttachmentOffset 或所有特征执行器的 FreeCAD 局部坐标链语义。
  • FCStd 仍以安全预检、metadata/proxy 和只读报告为主本轮新增对象属性名、FreeCAD 类型、XML 元素和值的字段级 Document.xml 投影,但尚未双向原生往返。

5. 下一步执行顺序

  1. 补齐 P2 浏览器实证门禁:真实 SQLite v4→v5 升级、OPFS 孤儿清扫、QuotaExceeded、大文件和崩溃注入合同层与 fallback 测试已由 6bfbdf5 完成。
  2. 补齐 P3-03 浏览器 OCCT 包围盒/体积黄金测试,并验证 Placement 撤销、保存和恢复的真实 Worker 路径Node/fallback 合同已通过。
  3. 为 ambiguous/deleted TopoRef 补 3D 候选高亮,并增加真实 OCCT/SQLite 浏览器回放;候选替换 Facade 事务和属性/诊断 UI 已进入当前里程碑。
  4. 基于已锁定的 FreeCAD 1.1.1 源码提取 planegcs 最小依赖图,完成 SK-03 Emscripten/WASM POC同时扩充回放夹具、约束分类和 Sketch 编辑事务。
  5. 扩展 PartDesign推进 Loft/Pipe/Groove、Thickness/Draft以及 Mirrored/MultiTransform/Pattern/Hole 的局部特征历史与完整语义。
  6. 完成 FCStd 原生对象/属性/Shape 双向映射和 STEP/IGES/STL/Web CAD 包导入导出。
  7. 按核心优先级完成 TechDraw、Spreadsheet、Draft、Assembly、BIM、Mesh、Surface、FEM、CAM 等工作台。
  8. 最后通过跨浏览器、性能、内存、安全、可访问性、离线/PWA、升级回滚和发布差异报告门禁。

6. 接续操作

cd /home/mes123456/working_Web_FreeCAD_Bitbybit
git status --short
git log -5 --oneline
./npmw run verify

每个独立里程碑必须:

  1. 更新实现与聚焦测试。
  2. 更新 config/compatibility-matrix.json 和两份实施方案中的真实状态。
  3. 运行 ./npmw run verifygit diff --check 和 JSON 校验。
  4. 单独提交并推送 main,不得把凭据写入仓库。

7. 2026-08-03 P2 接续进展

本轮已完成 schema v5 迁移运行器、最近 5 版文档检查点、loadCheckpoint()、配额预检、资源清扫计划/API 和 1000 次写队列压力实现。完整门禁已通过,并由提交 6bfbdf5 推送到云仓库。后续 TSN 里程碑把 schema 提升到 v6objects.topology_json 保存 generation 拓扑快照;真实浏览器 v5→v6 升级仍需补证。

证据边界Node/fallback 证明迁移合同、队列、检查点与纯资源策略;真实浏览器 SQLite v4→v5 升级、OPFS 孤儿清扫、QuotaExceeded、大文件与崩溃注入仍是 P2/P8 后续任务,不能因本轮测试而标记完整 G4/G5。

8. 2026-08-03 Placement 里程碑快照

Placement 里程碑涉及实现、测试、兼容矩阵和三份状态/方案文档:

  • src/facade/recomputeEngine.tsShape 生成成功后读取对象 Placement,通过 geometry.applyPlacement() 执行平移/轴角旋转;恒等 Placement 不创建额外 Shape成功后释放局部 Shape缓存只提交变换后的句柄。
  • tests/facade.test.ts:新增非恒等 Placement 与恒等 Placement 的执行器测试。
  • docs/continuation-status.zh-CN.mdconfig/compatibility-matrix.json 及两份实施方案:记录本里程碑的能力边界和验证证据。

已完成的当前工作区验证:

./npmw run test:facade  -> 61/61 通过
./npmw run build        -> 通过

完整 ./npmw run verifygit diff --checkjq empty config/compatibility-matrix.json 均已通过Placement 已作为独立里程碑提交并推送到远端 main

  1. 浏览器 OCCT 包围盒黄金证据若无法自动化,保持 P3-03 为 IN PROGRESS
  2. TSN generation 历史写回已进入当前工作区;提交后推进候选替换事务与下一批 PartDesign 特征,不把签名回退误标为 OCCT 原生历史。

9. 2026-08-03 TSN generation 写回快照

  • geometry.topology() 同时返回可序列化的面/边/点签名条目;几何执行器只在 generation 被接受且拓扑采集成功后提交 Shape 和 ObjectTopologySnapshot
  • 每个对象快照记录 generation、文档版本、迁移 matches 和 signature-fallback 历史;拓扑采集失败释放本轮 Shape最近有效缓存不被覆盖。
  • 重算提交遍历 App::PropertyLinkSub 与 Sketch 外部几何:稳定引用写回新 generation歧义/删除引用不强绑,所有者保持 dirty/warning 并产生 TOPOLOGY_REFERENCE_AMBIGUOUS/DELETED 诊断。
  • schema v6 新增 objects.topology_jsonfallback 保存/加载已验证快照深克隆;真实 SQLite/OPFS v5→v6 升级尚未进行浏览器实证。
  • 完整 ./npmw run verify、diff/JSON 校验均通过;里程碑已由 ffbe2c6 推送。

这仍不是 OCCT/FreeCAD 原生历史:签名来自三角网格,缺少曲面/曲线参数、邻接图和 Boolean 的逐输入原生历史。候选替换事务/UI 已在下一里程碑补齐,但 3D 候选预选与高亮尚未实现,因此 F3/TSN-03/07/09 不能标记完成。

10. 2026-08-03 TopoRef 候选替换快照

  • 新增 Facade resolveTopologyReference() 事务按所有者、PropertyLinkSub/ExternalGeometry 名称和候选 persistentId 定位引用;候选必须存在于源对象最新拓扑快照且 kind 一致。
  • 用户明确选择后写入 stable TopoRef 和最新 generation重建 topo-ref DAG 边,标脏依赖闭包,更新文档版本并进入 Undo/Redo 与自动保存。
  • 属性面板对 ambiguous/deleted LinkSub 显示候选菜单;诊断页对 LinkSub 和草图外部几何显示候选替换控件。非法候选拒绝,不修改文档。
  • 完整 ./npmw run verify、diff/JSON 校验通过Chrome 桌面/移动布局无重叠SwiftShader 延时截图确认 OCCT canvas 非空;提交和推送仍待执行。

尚未完成 3D 面/边/点候选预选与高亮,也没有真实 OCCT 浏览器黄金回放,因此 TSN-09/F3 仍保持进行中。候选替换里程碑已由 56903db 推送。

11. 2026-08-03 Mirrored whole-shape 快照

  • geometry.mirror() 对文档/Shape 句柄、原点和非零法向做 Facade 校验,再调用 Bitbybit mirrorAlongNormal()
  • PartDesign::Mirrored 文档对象保存 Base、Plane 与 FuseTask 更新 Body.Tip 和 DAG。重算按 XY/XZ/YZ 映射法向Fuse 时 union Base 与镜像副本,并始终释放临时副本。
  • 当前是整 Shape 镜像,不是 FreeCAD 对选中特征历史的镜像;平面固定经过文档原点,未接 DatumPlane/Sketch axis/TopoRef 支持,也未证明单实体规则。
  • 完整 ./npmw run verify、diff/JSON 校验通过;里程碑已由 4aa6ca4 推送。

12. 2026-08-03 MultiTransform whole-shape 快照

  • App::PropertyMultiTransform 保存最多 6 个有序步骤;每个步骤使用稳定 ID 和 Linear/Polar/Mirrored 判别联合不解析自由字符串。Facade 写入边界校验枚举、数值、唯一 ID 和笛卡尔组合后的 100 实例上限。
  • Task 面板与 Data 属性面板共用步骤编辑器,可添加、删除、切换类型并编辑 Count/Length/Direction、Count/Angle/Axis 或 Plane提交绑定 Base、更新 Body.Tip并进入 Undo/Redo、自动保存和深拷贝持久化。
  • 重算从 Base whole Shape 开始,每一步作用于前一步的全部实例,最终 union成功或中途失败都释放镜像/平移/旋转副本,失败不覆盖上一次成功缓存。接受的 generation 继续走统一拓扑采集和写回。
  • 合同测试覆盖 Mirrored→Linear 的 6 实例组合、参数映射、完整临时句柄回收、故障注入、最近有效缓存保留、100 实例拒绝、任务提交、深拷贝、Undo/Redo 和 fallback 持久化。

当前实现不是 FreeCAD Transform feature history 的完全等价实现:它组合并融合整个 Base Shape未实现局部特征列表、Datum/TopoRef 轴面、单实体过滤或 OCCT 原生历史。下一执行点是 Additive/Subtractive Loft 的结构化截面合同与 whole-shape experimental 执行边界。

本里程碑不得声称 P3-03、F3 或完整 FreeCAD 兼容已经通过。当前对象 Placement 是 Shape 生成后的对象级变换,尚未证明 FreeCAD 对 Body/Tip、Support、AttachmentOffset 和局部坐标链的完整等价语义。

13. 2026-08-03 FreeCAD 原生黄金 oracle 快照

  • 官方 1.1.1 标签已在线核验到提交 0108fd4b4850cc46e625b60e53cea7a7bbe69f8dfetch:freecad-source 只接受该提交并使用 detached checkout。
  • configure:freecad-nativebuild:freecad-native 已在 Debian trixie 上完成 Release、无 GUI、Part/Material/Measure 最小构建;产物报告 FreeCAD 1.1.1 Revision: 14556 (Git),哈希和工具版本记录在 config/freecad-native-build.json
  • 新增声明式黄金契约、FreeCAD Python driver、CLI 回放器和比较器。Box、Cylinder、Sphere、Cone、穿孔 Cut 共 5/5 场景通过有效性、拓扑、体积/面积和包围盒对比。
  • 全部 Node/npm 操作均使用 ./npmw;依赖、构建、回放和 CI 边界已写入 docs/freecad-baseline-and-golden.zh-CN.md

本轮只完成 P0-01/P0-03 的首批可复现基线。依赖容器 digest、完整 FreeCAD 工作台构建、100 个黄金文件、50 个错误文件、GUI 行为和 Web OCCT 双端差分尚未完成F0/G0 保持进行中。下一执行点是读取 FreeCAD/OCCT 原生 Generated/Modified/Deleted 历史接口并形成可供 Web TopoRef 消费的类型化历史合同。

14. 2026-08-03 全功能范围账本与 Bitbybit 构建轨道

新增 FreeCAD 1.1.1 全功能对标主任务账本,以锁定源码 src/Mod 的 34 个模块和 App/Base/Gui/Main 通用能力为完整范围。账本把任务拆成 INVBASEBYBCORETSNSKPARTPDFC、各工作台任务和 QA/REL 门禁;源码中的 Sandbox/模板/测试设施以及 Python、宏、插件、偏好、打印和剪贴板均必须有明确能力等级不得隐藏在“其他”中。

几何实现改为 Bitbybit 优先:先复用 Bitbybit 的 OCCT Worker、建模、IO、三角化、缓存和资源生命周期公开 API 不足时,从锁定的 Bitbybit/OCCT 源码扩展绑定并用 Emscripten 构建自有 WASM provider。对应 BYB-01..08 要求来源提交、补丁、ABI/消息协议、SBOM/许可证、产物 hash、句柄回收和 Bitbybit↔自构建 provider↔FreeCAD 三方黄金差分。React 仍只能通过 BitBybitWebCadFacade 访问几何。

兼容矩阵新增 sourceScope34 个模块)和 geometryBuildStrategy,并把 AddonManager、Cloud、Fem、Help、Idf、Import、JtReader、Material、Measure、MeshPart、OpenSCAD、Plot、Points、ReverseEngineering、Robot、Show、Start、Web 及开发/测试目录登记为 scope-only/unsupported,直到各自任务与证据完成。现有 Part/PartDesign/Sketcher/持久化/FCStd 等状态不提升,仍按实验或只读边界执行。

本机 FreeCADCmd reference probe 已接入 ./npmw run probe:freecad-reference:实测报告为 FreeCAD 1.1.1、commit 0108fd4b4850cc46e625b60e53cea7a7bbe69f8dguiUp=false;当前构建可加载 PartMaterialMeasureSketcher/PartDesign/TechDraw/Spreadsheet/Draft/Mesh/Fem/CAM/Assembly 明确 unavailable。探针会采集核心 TypeId 和 Property 元数据,作为 INV-02 和后续黄金夹具的输入;完整桌面工作台行为仍需启用对应 FreeCAD 原生模块后再回放。

本轮已把 geometry.topologyHistory() provider 接入 createFacadeGeometryRecomputeExecutor:对有 Base/Tool/Profile 拓扑输入的特征,若 Worker 提供原生记录,则使用 captureNativeTopologyHistory() 按 kind 和 source/result index 生成 occt-native 历史provider 缺失、无输入或不支持时继续使用 signature-fallback。新增原生关系映射、删除、重复记录和索引越界测试,完整门禁 68/68 通过。该接线不等于 OCCT 原生历史已可用,真实 Bitbybit/OCCT 自构建绑定仍由 BYB-04..07 完成。

新增 check:bitbybit-history 绑定面审计并纳入 ./npmw run verify。审计结果明确记录当前 npm 绑定的原生历史缺口,防止 occt-native 合同在没有 Generated/Modified/IsDeleted 实现时被误报为完成。

BYB-01/02 证据已锁定:本地 Bitbybit 源码快照为 d3f52bd1fcf78148b60800d69ed6b42e53f4ad06(版本 1.1.1),记录于 config/compatibility-matrix.json;门禁会同时校验源码提交与安装包版本。

本轮已完成 BYB-04 的第一版实际编译:native/occt-history 从缓存 OCCT bb75017e915f6509a4bfa8b551f853352754c2da8.0.0)构建 TKBOTKDESTEPTKXSBaseTKDE 和 Embind WASM./npmw run test:occt-history 通过,shapeToStep -> booleanHistoryFromStep(cut) smoke case 返回 42 条原生关系记录。mapNativeOcctHistoryRecordscreateNativeOcctStepHistoryBridge 已把 provider 协议接入 Facade 类型边界。该 provider 当前仍是独立 WASM 实例;跨 Bitbybit 主 WASM 只能通过 STEP 文本序列化交换,不能直接传递指针。

15. 2026-08-03 原生 OCCT 历史 + STEP 跨 WASM 桥接

  • native/occt-history 现从 OCCT bb75017e... 编译 TKBOTKDESTEPTKXSBaseTKDEEmbind 暴露 GeneratedModifiedIsDeletedSTEPControl_Reader/WritershapeToStepbooleanHistoryFromStep
  • 原生 smoke 已验证 shapeToStep(makeBox()) -> STEP text -> booleanHistoryFromStep()cut 返回 42 条历史记录;最终 wasm 在 Node 22.23.2 可实例化。
  • 由于当前 Emscripten/OCCT 大型静态链接的 wasm 异常控制流限制,依赖库固定 -O0 -fexceptionsEmbind wrapper 固定 -O2 -fexceptions;产物 hash 记录在兼容矩阵并由 check:bitbybit-history 校验。
  • createNativeOcctStepHistoryBridge() 已加入 Facade它只把 Bitbybit exportStep() 的文本交给原生 provider禁止传递跨 WASM ShapeHandle重算器仅对 Part::Fuse/Cut/Common 注入明确 operation其余特征继续签名回退。

该里程碑仍不是默认 GeometryRuntime也没有把所有 PartDesign 特征切换到原生 provider本轮已补齐 BitbybitGeometryRuntime.configureNativeHistory(),显式配置后 Boolean 重算会通过 STEP 和协调器消费原生记录。浏览器真实 WASM 实例化、STEP 精度/单位策略和 Bitbybit↔原生↔FreeCAD 三方黄金差分仍是 BYB-05..08TSN-03..10 后续门禁。

16. 2026-08-03 原生历史协议与故障隔离

  • 新增 NATIVE_OCCT_HISTORY_PROTOCOL_VERSION = 1,请求携带 documentId/documentVersion/operationId 和两份 ISO-10303-21 STEP 文本,响应携带 provider 能力、原生历史和上下文回显。
  • DirectNativeOcctHistoryProvider 绑定已编译 Embind 模块;NativeOcctHistoryCoordinator 统一处理 AbortSignal、超时、取消、stale 文档版本和并发 generation未把任何 ShapeHandle 放进消息协议。
  • Facade 测试新增协议上下文、STEP 格式拒绝、timeout/cancel/stale 覆盖;完整测试数更新为 72/72。

该协议已完成 BYB-05 的类型/合同层,并新增 NativeOcctHistoryWorkerProvider/Worker 入口;构建脚本会把产物发布到 /native/occt-history/BitbybitGeometryRuntime 可显式配置该 provider 并把 STEP 历史接入 Facade 重算。跨浏览器真实 WASM 实例化、Worker 崩溃恢复和三方黄金差分仍需单独验证,不能把 Node 原生 smoke 当作浏览器证据。

本轮文档变更验证必须使用项目包装器:

./npmw run verify
git diff --check
jq empty config/compatibility-matrix.json

17. 2026-08-03 本机 FreeCAD 参考与后续安排

再次执行 ./npmw run probe:freecad-reference 已确认锁定 oracle 为 FreeCAD 1.1.1、提交 0108fd4b4850cc46e625b60e53cea7a7bbe69f8d。当前缓存构建 guiUp=false,可加载 Part/Material/Measure;其余工作台是构建缺失证据,不是对应 Web 功能的行为 oracle。

新增 FreeCAD 1.1.1 全功能对标执行路线图,按 R0 参考环境、R1 几何/拓扑、R2 Sketcher、R3 参数化核心、R4 FCStd、R5-R8 工作台与平台长尾、R9 发布门禁连续执行。近期先完成完整桌面 O2 oracle、机器清册差分、真实浏览器原生历史三方黄金再进入 planegcs 与 PartDesign 完整闭环。

18. 2026-08-03 全功能执行 WBS 与机器门禁

新增 FreeCAD 1.1.1 全功能对标执行 WBSconfig/freecad-execution-plan.json。计划把十项总目标分配给 ORACLE、KERNEL、TOPO、SKETCH、CORE、IO、DOC、ENGINEERING、PLATFORM、QUALITY 十个责任 lane登记 P01-P10、G0-G9 和 83 个任务;每个任务均包含状态、依赖、交付物和验收条件。

新增 ./npmw run check:execution-plan 并纳入 ./npmw run verify。门禁校验锁定基线、lane/program/gate 唯一性、P01-P10 完整性、任务 ID、状态、依赖存在性、依赖无环、非空交付物/验收条件和 program→gate 对应关系。任务只能在专项证据和下游交接完成后标记 completed

19. 2026-08-03 INV-01 源码 34 模块清册

新增 scripts/generate-freecad-source-inventory.mjsscripts/check-freecad-source-inventory.mjsconfig/freecad-source-inventory.json。生成器读取锁定 FreeCAD src/ModInitializeFreeCADBuildOptions.cmake,记录 34 个模块的 CMake 开关、App/Gui 目录、Python 文件数量、命令注册入口和运行时 oracle 状态;当前共发现 406 个 Python 命令入口。清单基线使用 .cache/freecad/FreeCAD 相对路径和锁定 commit避免把本机绝对路径写入版本产物。

./npmw run check:freecad-inventory 已纳入 ./npmw run verify,并要求可用源码 checkout 的目录集合与清单完全一致。静态源码清册仍不能替代 O2 完整桌面 oracle对象、属性、格式和 GUI 行为继续由 INV-02..06ORA-* 任务补齐。

新增 scripts/generate-freecad-type-property-inventory.mjsscripts/check-freecad-type-property-inventory.mjsconfig/freecad-type-property-inventory.json。该清册按源码文件记录 C++ ADD_PROPERTY(_TYPE)App::Property* 成员、Python addProperty 和 TypeId 调用候选,当前覆盖 4308 个源码文件、1673 个对象线索文件;它只证明来源可追溯,不把静态候选提升为运行时兼容。./npmw run check:freecad-type-properties 已纳入 ./npmw run verify

scripts/freecad-reference-probe.pyrun-freecad-reference-probe.mjs 已扩展 ORA-02 模块状态模型。探针现在验证 12 个目标模块,并对每个模块输出 compiledimportableguiRequiredguiAvailableruntimeStatus;本机 headless oracle 实测汇总为 compiled-importable: 3not-built: 9。完整 GUI oracle 建成后还需采集 gui-only-unprobeable 与 GUI 命令/Task 行为ORA-02 保持 in_progress

20. 2026-08-03 Web 原生历史 Worker 故障恢复

NativeOcctHistoryWorkerProvider 已增加 Worker 崩溃后的终止、监听器解绑、实例重建和重新初始化流程;正在执行的请求会收到失败,下一次初始化会使用新 Worker避免把失效实例继续用于浏览器 CAD 重算。新增 Facade 测试覆盖崩溃→重建→重试路径,当前 Worker provider 仍由配置显式启用,不能把 Node/fake Worker 合同测试当作真实浏览器 WASM 证据。

BYB-06 已更新为 in_progress,后续继续补 Shape ownership/reference ledger、长 Boolean 内存预算和真实 Chrome Worker 实例化其他浏览器测试延期BYB-07 三方 Boolean 黄金保持 pending。

21. 2026-08-03 Bitbybit Shape ownership metrics

GeometryCapabilities 现在公开 shapeCountkernelReferenceCountreleasedShapeCountpeakShapeCountpeakKernelReferenceCountBitbybitGeometryRuntime 在 Shape 注册、引用计数递减、最后一个 Shape 释放、初始化失败和 dispose 时同步这些指标;它们只描述当前 Facade 进程内的 ownership ledger不等同于 WASM allocator 的字节级统计。真实浏览器长 Boolean 压力测试需继续把这些指标与 Worker/WASM memory telemetry 对照。

Bitbybit 主 OCCT WASM 已确认编译完成并由 ./npmw run check:baseline 校验:node_modules/@bitbybit-dev/occt/bitbybit-dev-occt/bitbybit-dev-occt.a4a6ec2a.wasmSHA-256 为 1b6a8fc7b83d222854f73b66af8d0e45ad4fdee025904b447e885d4e18ae8656。兼容矩阵现在将其标为 compiled-artifact-verifiedmissingBuildInputs 仅表示无法从当前 Bitbybit 源快照独立重建该产物,不再表示浏览器 WASM 不存在。

22. 2026-08-03 P02 三端与三方门禁收口

  • BROWSER-OCCT-01 已完成Chrome 真实加载 JS/WASM WorkerCOOP/COEP 隔离、OPFS 写读删、初始化、42 条 history、取消恢复、Worker 重启恢复通过。
  • MEM-OCCT-01 已完成Chrome 运行 1000 次 BooleanWASM 堆初始/峰值/结束均为 128 MiB峰值预算 256 MiB、保留 0浏览上下文由 measureUserAgentSpecificMemory 实测保留 469828 bytes预算 64 MiB3000 个 OCCT 句柄全部释放Boolean Worker 未创建 GPU 资源且存活数为 0。静态门禁./npmw run check:browser-occt。其他浏览器测试延期至全部任务完成并收到明确通知。
  • BYB-03BYB-05BYB-06 已完成;BYB-07 已完成 26 个 Boolean 三方场景,报告为 config/freecad-bitbybit-native-threeway.json,门禁为 ./npmw run check:freecad:threeway
  • BYB-08 已完成:config/occt-upstream-drift-baseline.json 锁定 Bitbybit 包/源码/WASM、5 个关键声明接口、原生 OCCT JS/WASM以及 100 场景 manifest 和 26 场景三方报告 hash./npmw run check:occt-upstream-drift 已纳入统一 verify。P02 的 7 个任务现已全部关闭。
  • TSN-04 已完成第一版真实内核闭环Bitbybit Worker 使用 BRepGraphFaceInfo/BRepGraphEdgeInfoGetFaceSurfaceType 和 B-Rep 面积/长度属性生成解析面/曲线签名参数范围按方向归一化Chrome harness 实测 Box 为 6 面、12 边、8 点,解析面/边全覆盖,未使用三角化索引。

23. OPFS 文件系统约束

Web FreeCAD 的持久化主路径是 OPFS。SQLite/OPFS worker、内容寻址资源、FCStd/BRep/Shape 资源、迁移、配额预检、孤儿清扫和崩溃恢复必须按 OPFS 语义验收;sqlite-memory 仅允许作为 OPFS/Worker 不可用时的瞬时降级,并且必须报告数据不持久化原因。后续 FCStd 双向 round-trip、资源引用计数、迁移回滚和插件数据隔离均不得绕过该约束。

24. 2026-08-03 TSN-05/06/09/10 增量收口

拓扑迁移现在使用 OCCT 解析邻接图计算置信度:面邻接/面-边、边-面/边-点、点-边均以持久 ID 保存,当前候选通过稳定映射后再计算交集;邻接冲突低于阈值会明确变为 ambiguous不会静默绑定。对象拓扑快照和克隆路径会复制邻接图OPFS 保存/加载不再丢失迁移证据。

Facade 新增子形选择与预选合同,只接受当前对象拓扑中的 persistentId,拒绝不存在、删除或瞬时索引;选择状态不写入文档。runTopologyMutationReplay 使用固定种子运行 100 个模型、1000 次变异(刚体重排、参数变化、拆分、删除、乱序),错误绑定审计为 0报告已纳入 Facade 测试和统一 verify。TSN-05 与 TSN-06 已按专项证据关闭TSN-09/TSN-10 等待其上游迁移/布尔历史任务完成后关闭。

签名历史回退现在收集关联对象的全部输入条目Base、Tool、Profile 等),多输入结果使用 sourceObjectId 与持久 ID 记录来源Pattern/跨 Body 不再退化为只比较当前对象自身;原生 OCCT Boolean 历史仍优先使用独立 Worker 结果。

Chrome 拓扑 harness 现将完整邻接图和持久 ID 写入 OPFS 临时文件、读回并删除;opfsTopologyRoundTrip: true 已成为 check:chrome-topology 的强制条件。

validateTopologySnapshotForPersistence 已接入项目保存边界,检查拓扑持久 ID 唯一性、邻接来源/目标完整性,并拒绝瞬时索引命名;这使 SQLite/OPFS 写入在数据进入 Worker 前就失败,而不是把不可迁移引用写入项目。

原生 OCCT history 响应现在校验关系记录与 hasModified/hasGenerated/hasDeleted 摘要标志的一致性;缺少对应标志的记录会在 Facade 边界失败,避免把不完整的 Worker 历史当成可靠 lineage。

25. 2026-08-03 CORE-10/11 attachment 增量

新增 src/facade/attachment.ts,定义 SupportMapModeAttachmentOffset 的类型和验证边界并以四元数合成支持放置与局部偏移轴角结果做确定性数值归一化。Sketch 对象现在暴露 MapModeAttachmentOffset 属性;所有变更仍经 Facade 历史、版本和持久化边界。

新增测试覆盖平面/面支持标识、非法 MapMode、非法偏移、绕 Z 轴的局部坐标链和 Sketch 属性事务。Support 现在也可使用 {objectId, subElement} 结构化值依赖图会记录支持对象。86 个 Facade 测试、拓扑回放100 模型/1000 变异/错误绑定 0、Chrome OCCT/OPFS、三方 Boolean、构建和统一 ./npmw run verify 均通过。TSN-07 至 TSN-10 已按可执行证据关闭CORE-09/10/11 继续保留进行中,待拓扑迁移驱动的真实 Support 绑定完成。

Support 的 subElement 现在可直接携带持久化 TopoRef。migrateDocumentTopologyReferences 会对该引用执行稳定、歧义和删除迁移,resolveDocumentTopologyReference 支持候选修复,依赖图按 topo-ref 记录其来源。新增测试覆盖 generation 更新、候选修复和源面删除。

26. 2026-08-03 CORE-09 Body Tip 生命周期

新增 src/facade/bodyRules.ts,按 Body 子树顺序选择最后一个未抑制、未上游抑制且可产出实体的特征作为 Tip同步和异步重算都会应用该规则。抑制末端 Fillet 后 Tip 回退到 Pocket恢复后重新指向 Fillet依赖闭包同时按更新后的 Tip 链收敛,避免保留过期 Body→Tip 边。

新增 Body 生命周期测试后 Facade 测试数为 86。统一 verify 通过,执行计划当前为 24 completed、18 in_progress、41 pending、0 blockedChrome OCCT stress 1000、OPFS topology round-trip、三方 Boolean 26 场景、拓扑回放 wrongBindings=0 均保持通过。

27. 2026-08-03 AttachmentOffset 重算链

重算器现在按支持对象 Placement、AttachmentOffset、对象自身 Placement 的顺序组合局部坐标,并保留 identity Placement 短路。Support + Offset 场景通过真实重算执行器验证,单次 OCCT placement 调用得到 10,2,0、Z 轴 90 度的确定性结果CORE-10 与 CORE-11 已按迁移和重算证据关闭。

28. 2026-08-03 Sketcher Projection 与 CarbonCopy 合同

Sketcher Facade 现在提供 projectGeometrycarbonCopy 事务。Projection 会克隆源几何并强制标记为 constructionCarbonCopy 为指定几何生成带前缀的独立副本,同时拒绝与已有几何或同一批次新几何冲突的 ID。两条路径均经过版本、历史、脏状态和持久化边界并保留原始约束/外部几何快照语义。

新增测试覆盖 Projection 的 construction 标志、CarbonCopy 的确定性 ID、缺失源几何和重复 ID 拒绝Facade 测试在本轮前为 86/86。SK-08 继续保持 in_progress:当前已完成支持引用迁移、外部几何和几何级 Projection/CarbonCopy 合同,仍需真实 OCCT 面投影、完整约束求解和交互编辑器证据后关闭。

29. 2026-08-03 Sketcher 参考尺寸与冗余诊断

SketchConstraint.driving=false 现在表示参考尺寸:求解器不会修改几何,也不会把该约束计入残差和 DOF rank默认值仍是 driving保持既有约束行为。相同 driving 约束通过规范化签名识别并输出 REDUNDANT_CONSTRAINT诊断不会阻断可收敛求解。新增测试覆盖参考尺寸只读语义、DOF 保持和重复约束诊断Facade 测试更新为 87/87。

SK-07 已从 pending 转为 in_progress。当前执行计划计数为 24 completed、19 in_progress、40 pending、0 blockedFreeCAD fixture 对照、完整 redundant/conflicting 分类和 planegcs WASM 仍是后续验收项。

30. 2026-08-03 Sketcher profile 与标准约束增量

新增 classifyPlanarProfile,以任意平面主轴投影区分 closed、open、multi-ring、self-intersecting、invalid-nesting、degenerate 和 non-planar。Pad、Pocket、Revolution 共用的 validatePlanarProfile 现在会在进入 OCCT 前拒绝显式开放、自交、孔越界、孔嵌套或穿越的轮廓默认点列继续按隐式闭合处理。SK-11 仍保持 in_progress,等待 Sketch B-spline/完整编辑和 FreeCAD 对照 fixture 后关闭。

依据锁定 FreeCAD 1.1.1 Sketcher/App/Constraint.h 差分TypeScript basic solver 新增 Parallel、Perpendicular 和 PointOnObject 的模型、复制、规范化签名、残差及求解路径协议能力表同步公开三项能力。InternalAlignment、SnellsLaw 和 B-spline Weight 未被错误宣称支持,继续依赖 planegcs/高级曲线层。Facade 测试更新为 89/89。

31. 2026-08-03 Sketcher 500 模型压力门禁

新增 runSketchStress./npmw run test:sketcher-stress,固定种子 0x20260803 生成 500 个模型、执行 1000 次求解。constraints、conflict、redundant、reference、drag 五类各 100完整 Snapshot 双回放确定性差异为 0意外状态为 0摘要为 1a35945d,本机耗时约 14 ms低于 2000 ms 门禁。该命令已纳入统一 verify

SK-12 已从 pending 转为 in_progress,执行计划当前为 24 completed、20 in_progress、39 pending、0 blocked。当前 drag 类是求解前点位变异和 PointOnObject 收敛,不冒充完整 GUI 拖拽SK-12 需在 SK-09、SK-11 和 FreeCAD/planegcs 黄金完成后关闭。

32. 2026-08-03 SK-03 planegcs WASM 收口

新增 native/planegcs 可复现构建,直接编译锁定 FreeCAD 提交 0108fd4b4850cc46e625b60e53cea7a7bbe69f8d 中的 Geo.cppConstraints.cppSubSystem.cppqp_eq.cppGCS.cpp。浏览器适配层只补齐 Console、TimeElapsed 和导出宏,未修改上游求解器。上游使用 std::async,因此产物启用两个 pthread并把 COOP/COEP 与 SharedArrayBuffer 作为 Chrome 门禁前置条件。

JavaScript 产物为 125594 bytesSHA-256 04a7c687970ea24276e689114fba4d4f0a09dd1da578e4625185df2c234de3fbWASM 为 445615 bytesSHA-256 3680c1702cf033c67445105ab5f3a6e4a97a0783dcebf85874b87ef72c41e3cc。Node smoke 与 Chrome 专用 Worker 都执行真实 GCS::System::solve()applySolution()Chrome 报告确认跨源隔离、SharedArrayBuffer、收敛状态 0 和残差 0。按用户约束未运行其他浏览器。

SK-03 已关闭,执行计划当前为 25 completed、20 in_progress、38 pending、0 blocked。现有 Embind 只承担原生产物和生命周期 smoke不冒充完整 Sketcher 适配SketchSnapshot 映射、取消/stale/崩溃恢复和完整约束面继续归 SK-04。

33. 2026-08-03 SK-04 Solver protocol 与 Worker lifecycle 收口

PlanegcsWorkerProvider 接入现有 SketchSolverProvider 合同,版本化校验 request/response 的 protocol、requestId、document、version 和 generation。Provider 在独立 Worker 中加载哈希固定的 Emscripten 产物,能力表明确声明当前只支持单线段、一个 driving Horizontal 和一个端点 DistanceEllipse、B-spline、外部几何或其它约束会返回可诊断的 unsupported 错误,不会静默降级。

取消会终止当前 Worker、拒绝挂起请求并在下一次求解重新创建实例Worker error 同样清空旧请求、标记 unavailable 并支持重新初始化。Facade 测试覆盖上下文校验、Embind vector 释放、取消/重建/崩溃恢复Chrome 端到端报告覆盖 completed、cancelled、recovered 和 stale generation。SK-04 已关闭,执行计划当前为 26 completed、19 in_progress、38 pending、0 blocked。

34. 2026-08-03 SK-05 几何模型增量

Sketcher 模型边界新增 validateSketchGeometryvalidateSketchSnapshotsketchGeometrySignature。Ellipse 现在校验有限中心、正轴半径和主/次轴关系B-spline 校验正整数 degree、控制点数量、正权重、非递减 knot 数组、周期曲线控制点下限;所有几何、约束和外部几何 ID 都拒绝空值与重复值。cloneSketch/createSketch 经过同一门禁,周期 B-spline 深拷贝和确定性签名回归通过basic solver 仍明确返回高级曲线 unsupported。

SK-05 保持 in_progress:模型 round-trip 基础已增强,尚需完整 FreeCAD Ellipse/B-spline 编辑黄金、曲率连续性、权重/knots 交互编辑和 FCStd 编解码后才能关闭。

35. 2026-08-03 Sketcher 高级约束代理边界

模型合同现在显式保留 FreeCAD 的 WeightInternalAlignmentSnellsLaw 约束字段、索引和值并纳入规范化约束签名和数值校验。TypeScript basic solver 对三类约束返回 UNSUPPORTED_CONSTRAINT 诊断既不丢弃约束也不把代理结果伪装成求解成功planegcs Worker 能力表同样不声明这些未绑定约束。

SK-06 继续 in_progress,下一步是对这些约束接入真实 planegcs geometry/constraint graph 与 FreeCAD 成功/失败 fixture。

36. 2026-08-03 Chrome OPFS SQLite persistence 证据

新增 ./npmw run test:chrome-persistencecheck:chrome-persistence。Chrome 在 COOP/COEP 隔离页面中真实启动 persistenceWorker,能力报告为 mode: sqlite-opfs、SQLite WASM true、OPFS true、schema v6Document 版本 7 保存/加载、checkpoint、资源 hash 写读释放和 PRAGMA integrity_check recovery 均通过。

这条证据只关闭 OPFS 项目存储的浏览器运行条件,不提升 FC-04..FC-11FreeCAD Document.xml/GuiDocument.xml、BRep/Shape 资源、Expression/Link/TopoRef 双向 round-trip 仍需独立实现和 FreeCAD oracle 对照。

37. 2026-08-03 FC-04 metadata archive vertical slice

新增 serializeFcstdMetadataArchive:从 Facade DocumentSnapshot 生成受控 Document.xmlGuiDocument.xml,将属性按 XML 类型写入,并通过 opaque entry 机制保留未知/代理资源字节;保留路径冲突、路径穿越和 XML GuiDocument 根节点校验。生成结果立即经 inspectFcstdArchive 读回对象类型、Label、未知资源路径和属性值回归通过。

该切片仍是 metadata-only没有把 Shape/BRep、ViewProvider 状态、Expression/Link/TopoRef 或 FreeCAD 原生 feature serializer 偷换成字符串FC-04 继续 in_progressFC-05/06/07 依赖项保持原状态。

38. 2026-08-03 FC-07 opaque rewrite 收口

新增 rewriteFcstdMetadataArchive:在更新 Document.xml/GuiDocument.xml 时,先验证并解压原归档,再把所有其它条目作为 opaque bytes 原样带回新 ZIP。测试对二进制未知资源和脚本字节逐字节比较并确认新 Label 可被再次解析;脚本仍只作为隔离 metadata绝不执行。

FC-07 已关闭,执行计划当前为 27 completed、18 in_progress、38 pending、0 blocked。Shape/BRep、ViewProvider、Expression/Link/TopoRef 和原生 feature serializer 不在此任务范围FC-04/05/06 仍未关闭。

39. 2026-08-04 FC-05 BRep resource extraction increment

FCStd inspection 现在会为归档中的 .brp/.brep 条目建立稳定资源清单记录归档路径、BRep 格式、字节长度、确定性内容指纹和空资源状态。extractFcstdShapeResources 通过 Facade project.fcstd.extractShapes 返回原始 Uint8Array,可直接交给后续 OPFS resource store 或原生 OCCT Shape reader路径和归档大小门禁继续由统一 inspector 执行。

该增量只解决资源发现、身份和字节 round-trip不宣称已经解析拓扑、质量属性或 ShapeHandle。FC-05 继续 in_progress,待原生 OCCT BRep reader、Shape/GuiDocument 关联及 FreeCAD oracle 对照完成后再关闭;执行计划为 27 completed、19 in_progress、37 pending、0 blocked。

40. 2026-08-04 FC-06 typed expression metadata increment

FCStd metadata writer/reader 现在保留属性上的 expression 字段,并继续以受控 JSON 字符串保存 Link、LinkSub、LinkList 和 TopoRef 值XML 属性名、类型和值均经过实体转义,未知资源仍由 FC-07 的 opaque store 原样保留。Facade 测试验证表达式写入后可被 inspector 读回。

这只是 FC-06 的 typed metadata 基础,不等同于 FreeCAD recompute 或完整引用迁移;真实 ExpressionEngine、Link/TopoRef 双向解析及可重算对象仍待后续原生 oracle 门禁。计划计数为 27 completed、19 in_progress、37 pending、0 blocked。

41. 2026-08-04 FC-06 proxy expression visibility

FCStd 只读代理文档现在会将 inspection 中的表达式投影为 Expression:<property> 只读属性。表达式仍不会在导入阶段执行原始值可供后续引用迁移与安全审计使用Facade 回归和生产构建均通过。

42. 2026-08-04 FC-05 OPFS resource media contract

Shape/BRep 提取记录新增固定媒体类型 application/x-freecad-brep,因此可直接交给 OPFS project.resource.put同时保留路径、长度、内容指纹和空资源状态。Facade 测试与生产构建通过;原生 Shape 解析仍未被冒充完成。

43. 2026-08-04 SK-08 Support 与 External Geometry 收口

Sketcher Support/Attachment、External Geometry、Projection/CarbonCopy 和上游 TopoRef 迁移已有完整 Facade 回归:支持面引用可迁移为 stable、ambiguous 或 deletedExternal Geometry 依赖边可持久化禁止自引用导入。SK-08 已从 in_progress 转为 completed;计划计数为 28 completed、18 in_progress、37 pending、0 blocked。

44. 2026-08-04 CORE-09 Body/Origin/Tip 收口

Body Tip 规则新增删除和重排回归:已删除对象不会保留为悬空 TipBody 子项重排后选择最后一个未抑制的单实体特征Sketch 与非实体对象不会成为 Tip。既有测试同时覆盖 suppression、upstream suppression、undo/recompute 和 Origin plane 树。CORE-09 已完成;计划计数为 29 completed、17 in_progress、37 pending、0 blocked。

45. 2026-08-04 SK-05 Sketch geometry model 收口

Sketcher 几何模型已覆盖 Ellipse、非周期/周期 B-spline、construction 标记、控制点、权重、knots 和稳定 ID。深拷贝、确定性签名、重复 ID、非法轴/权重/knot 校验及 unsupported solver 边界均有回归;交互式 poles/knots 编辑继续属于 SK-10。SK-05 已完成,计划计数为 30 completed、16 in_progress、37 pending、0 blocked。

46. 2026-08-04 TSN-03 source-subshape explainability gate

Native topology history 现在强制每个输入子形状都有可解释关系。Worker 未返回显式 Modified/Generated/Deleted 时,仅在输出中存在唯一同类型、同签名对象时自动归类 Preserved无匹配或多匹配直接失败禁止静默遗漏。TSN-03 继续 in_progress,还需把原生 history 从 Boolean 扩展到全部 PartDesign feature。

47. 2026-08-04 Native history operation safety gate

原生 history 协议新增运行时操作白名单和 provider capability 复核。伪造的 pad/feature 操作不能进入双输入 Boolean STEP ABI未声明操作会显式失败。PartDesign feature history 将使用独立参数协议,避免把单输入特征错误解释为 object/tool Boolean。

48. 2026-08-04 SK-10 B-spline atomic editing increment

新增 editBsplineGeometry,可原子更新 poles、weights、knots、degree、periodic 和 construction同时强制保留稳定 geometry ID。编辑结果复用统一 B-spline 校验,非法 degree、零/负权重和错误 knot 数组不会产生半更新状态。SK-10 已转为 in_progress;计划计数为 30 completed、17 in_progress、36 pending、0 blocked。

49. 2026-08-04 SK-09 transactional point drag increment

新增 dragSketchPoint:按稳定 geometry/point 引用在克隆 Snapshot 上应用拖拽目标,然后重新执行 driving constraints并返回完整求解状态和诊断。原 Snapshot 不会被修改未知几何、非法点位和非有限目标会显式失败。SK-09 已转为 in_progress;计划计数为 30 completed、18 in_progress、35 pending、0 blocked。

50. 2026-08-04 SK-09 line split/extend increment

交互编辑合同新增 line split 和 extend 事务。Split 保留原线 ID、为新段分配显式稳定 ID并要求切点严格位于线段内部Extend 要求目标共线且位于指定端点之外。两者都不修改原 Snapshot约束迁移尚未指定时会明确拒绝受约束线防止静默破坏引用。

Line trim 事务也已加入:只移动选定端点,目标必须严格位于原线内部且共线,原 Snapshot 保持不变。SK-09 当前已覆盖 drag、split、extend、trim剩余 autoconstraint 与键盘/指针回放后再关闭。

Autoconstraint 已加入确定性建议与确认事务:按 tolerance 识别 horizontal、vertical 和 endpoint coincident稳定排序候选并去重已有约束确认阶段验证 suggestion/constraint ID、签名和重复项再原子写入克隆 Snapshot。SK-09 现在只剩键盘/指针事件回放与 FreeCAD oracle 对照。

新增 replaySketchEditorEvents,覆盖 drag、split、extend、trim、autoconstraint 以及 undo/redo 历史;相同初始 Snapshot 和事件序列产生相同 geometry signature回放过程不修改输入。SK-09 的实现面已完成,仍需真实 GUI pointer/keyboard oracle 对照后才能关闭。

新增 deleteSketchGeometry 与 replay delete 事件。删除前检查 constraint 和 External Geometry 引用;任何潜在悬空引用都会拒绝操作,安全删除返回新的 Snapshot。Facade 测试现为 105 项。

新增 setSketchConstruction 与 replay construction 事件,支持 construction 几何状态的事务切换,并纳入 undo/redo。Facade 测试现为 106 项SK-09 仍待真实 GUI pointer/keyboard oracle 对照。

51. 2026-08-04 P5 Groove geometry increment

PartDesign Groove 已接入 Facade geometry contract以 Bitbybit OCCT 将 profile 绕轴生成 revolved tool再对 Base 执行 differenceRecompute Engine 支持 PartDesign::Groove 的 Profile、Base、Angle 和 axis 参数,缺少 Groove runtime 时显式诊断。该增量不宣称完整 Groove 模式、反向轴和 FreeCAD oracle 已完成PART-ALL/PD-BASE 继续进行中。

Groove 现在也进入 Facade PartDesign command/task 流程提交对象、Base/Profile/Angle 属性、Body Tip 更新和后续 pattern 链接均有回归。完整 FreeCAD Groove 模式仍未关闭。

新增 validateGrooveInput,在进入 Bitbybit Worker 前校验 Base 的 document/version ownership、Profile、axis 和 angle跨文档 Shape、零轴和非法 profile 现在在 Facade 边界明确失败。

52. 2026-08-04 FCStd Shape-to-OPFS resource bridge

新增 storeFcstdShapeResourcesproject.fcstd.storeShapesFCStd inspector 先执行归档/路径/大小门禁,再把非空 BRep payload 通过现有 OPFS project.resource.put 写入,返回原始 FCStd 路径、媒体类型、内容指纹和 resource hash 映射;空 .brep 不会占用资源引用。Facade 回归验证了字节、媒体类型和资源边界。

53. 2026-08-04 FC-06 typed property decode increment

新增 decodeFcstdPropertyValue:按 FreeCAD 属性类型恢复数字、布尔和 Link/LinkSub/LinkList/Vector/Placement/MultiTransform JSON 值;表达式只作为 metadata 保留不会执行。JSON 或标量解析失败返回 decoded:false 与诊断文本,原始字符串不丢失。

54. 2026-08-04 FC-04 GuiDocument inspection increment

FCStd inspection 现在解析 GuiDocument.xml 的存在性、SchemaVersion、View 节点数量和稳定 XML 指纹;缺失 GuiDocument 会明确报告 present:falseDOCTYPE/ENTITY 仍被拒绝。视图内容保持只读 metadata不执行 ViewProvider 或脚本。

GuiDocument inspection 进一步提取按归档顺序排列的 View name、type 和 visibility 条目,供视图差异与 round-trip 报告使用;未知 ViewProvider 字段继续由原 XML opaque preservation 保留。

GuiDocument writer 新增结构化 guiViews 选项,受控生成 name/type/visibility View XML 并可被 inspector 双向读回;原始 guiDocumentXmlguiViews 互斥,空 view name 明确失败。Facade 测试现为 110 项。

Object extension inventory 已加入 FCStd inspector从 declaration 和 ObjectData 收集 Extension type/name按归档顺序去重但不实例化未知 extension。Facade 测试现为 111 项extension 原 XML 仍由 opaque rewrite 保留。

FCStd XML 入口现在强制 Document.xmlGuiDocument.xml 使用各自标准根节点,移除任意根节点 fallback损坏归档会在对象/View 映射前失败避免被误判为合法空文档。DOCTYPE/ENTITY 禁令及 opaque resource 保留合同不变。

55. 2026-08-04 FCStd typed XML writer increment

FCStd writer 不再把所有属性统一写成 <String>Length、Angle、Bool、Float、Integer、Percent、Link、LinkSub、LinkList、Vector、Placement 和 MultiTransform 使用对应 typed XML 元素type 属性、值和 expression 同时保留reader 继续兼容旧 String 归档。

56. 2026-08-04 FC-08 Bitbybit exchange import boundary

Bitbybit OCCT Worker 新增 plugins.io.importShape,支持 STEP、IGES、BREP 文本通过 ReadSTEPFromStringReadIGESFromStringReadBREPFromString 实例化 Shape并由 Facade geometry.importShape 注册 document/version-owned ShapeHandle。空 payload、未知格式和非法 document context 在 Worker 前明确拒绝;单位/颜色/容差和 100-model golden 仍属于 FC-08 后续验收。

57. 2026-08-04 FC-11 exchange payload memory gate

geometry.importShape 增加 MAX_GEOMETRY_IMPORT_TEXT_BYTES = 128 MiB 门禁,以 UTF-8 字节数检查 STEP/IGES/BREP payload超限内容在 Worker 前明确失败,避免大文件直接进入 OCCT。流式读取、取消和完整大文件恢复仍属于 FC-11 后续验收。

新增 collectGeometryImportText 异步 UTF-8 chunk 收集器:逐块检查 AbortSignal、累计字节上限并拒绝非法编码只有完整非空文本才进入 import boundary。Facade 测试覆盖 split UTF-8、超限、取消和 invalid encoding。

58. 2026-08-04 QA-03 Chrome 应用 E2E 与视觉基线增量

新增真实生产构建的 Chrome CDP E2E不引入其他浏览器覆盖 start-to-workspace、Workbench 切换、Create Sketch command 和 bottom drawer 交互;桌面 1440x1000 检查面板分隔、控件文本溢出、页面横向溢出、Bitbybit OCCT canvas 来源及逐帧 WebGL 像素,移动 390x844 检查标题、主操作和横向溢出。Chrome 控制台、运行时异常和 Log error 均为硬失败。

桌面/移动 PNG 基线保存于 fixtures/chrome-app-e2e/SHA-256、尺寸和字节数写入 config/chrome-app-e2e-verification.jsoncheck:chrome-app-e2e 已接入整套 verify。当前证据为 Chrome 150、OPFS sqlite-opfs、canvas 736x664/20 色、页面异常 0QA-03 从 pending 转为 in_progress,待 import/export、FCStd、保存/恢复和完整参数化工作流视觉对照后关闭。计划计数为 30 completed、19 in_progress、34 pending、0 blocked。

Chrome E2E 随后扩展到任务取消、等待真实 OPFS save completion、Project Manager 列表和重新打开,以及 Export 页 STEP/STL/IGES capability state 与 STL 选择;保存成功 toast 已从按钮即时反馈移动到 persistence Promise 完成回调,避免先报成功后报失败。

59. 2026-08-04 FC-11 XML 结构门禁与 QA-04 parser fuzz

FCStd inspector 现在使用严格 XML validation并显式限制 128 层嵌套和 250000 XML 节点;限额可通过 FcstdArchiveLimits 下调测试。Document/ObjectData 中的对象 name 必须非空且唯一writer 也拒绝空或重复对象 ID阻止损坏归档覆盖映射身份。

新增固定种子 0x5f3759df 的 1000-case FCStd parser fuzz覆盖合法空文档、proxy、opaque resource、畸形 closing tag、错误根、重复/空 ID、深度/节点超限、实体声明、非法 UTF-8、错误 GuiDocument 根和 traversal path每项必须得到预期 accept/reject拒绝必须抛出 Errorp95 预算为 50 ms。test:fcstd-fuzz 已接入 verifyQA-04 从 pending 转为 in_progressgeometry/solver fuzz 尚未完成。计划计数为 30 completed、20 in_progress、33 pending、0 blocked。

QA-04 geometry input fuzz 新增固定种子 0x9e3779b9 的 2000-case 门禁,覆盖 primitive、placement、mirror、Boolean、fillet/chamfer、Pad/Pocket、Revolution/Groove 和 STEP import 的合法及恶意边界。全部样本只经统一 Facade validator 分流合法输入不被误拒非法有限数、轴、Shape ownership/version、基数、边索引、profile 和格式不进入 Bitbybit Workerp95 预算为 10 ms。

QA-04 solver fuzz 新增固定种子 0xa5a5f00d 的 2000-model/4000-solve 门禁,覆盖 horizontal、parallel、tangent、reference dimension、unknown geometry/point、非法 dimension、重复约束、block conflict 和 unsupported B-spline weight。双回放必须完全确定输入 Snapshot 不可变status/diagnostic/iteration/residual 不变量和 10 ms p95 预算均为硬门禁。QA-04 的 parser、geometry input 和 solver graph 子项已有连续证据;真实 OCCT operation mutation 与 native planegcs 随机大图仍待后续关闭。

60. 2026-08-04 P5 Bitbybit Loft 增量

同一轮 P5 继续补齐独立 Part::ExtrudePart::Revolution:两者分别调用 Facade 的 geometry.extrudegeometry.revolution,不再把 Part 对象误判成 PartDesign 特征。Extrude 读取 Base/Dir/LengthFwd/Reversed/SymmetricRevolution 读取 Source/Base/Axis/Angle,并继续应用对象 Placement。Bitbybit 1.1.1 尚未暴露 Part shell、taper、DirLink/AxisLink 的等价语义;LengthRev 与对称 Revolution 已在后续组合增量中由两个方向明确的 Shape 加 Boolean Union 实现。PART-ALL/PD-BASE 继续进行中。

Part 工作台 manifest、命令状态和任务提交链已同步接入这两个独立对象仅在选择 Sketcher profile 时启用,任务属性分别生成 FreeCAD 风格 Base/Dir/LengthFwdSource/Base/Axis/Angle,对象位于文档顶层且不会改写 PartDesign Body Tip。Facade 回归验证类型、属性、DAG 依赖和树归属GUI command inventory、Facade boundary、118 项 Facade 测试及生产构建通过。

Facade 新增严格 LoftInput 合同与 Bitbybit 1.1.1 occt.operations.loft 执行路径。简单 Loft 要求至少两个闭合、无孔 sectionstandaloneadditivesubtractive 分别映射 Part Loft、与 Base union、从 Base differenceShape ownership/version 在进入 Worker 前校验。几何 fuzz 已加入独立/加料合法样本及 section 数量、孔边界恶意样本。

Recompute Engine 支持 Part::LoftPartDesign::AdditiveLoftPartDesign::SubtractiveLoft,兼容完整 SectionsProfile + Sections 链接形式,并将各 Sketch 的 Placement/Attachment 变换应用到截面坐标。回归覆盖三种模式、重复/缺失链接、Base 缺失和 Bitbybit Loft 失败后保留上一版有效 Shape。PD-LOFTpending 转为 in_progresstransition、带孔高级 Loft 和 FreeCAD oracle 对照仍未完成。计划计数为 30 completed、21 in_progress、32 pending、0 blocked。

Pipe 子路径同样只使用 Bitbybit开放 Sketch line chain 经规范方向和 Placement/Attachment 变换后,由 createPolylineWire 构造 Spine闭合 profile face 交给 occt.operations.pipePart::SweepPartDesign::AdditivePipePartDesign::SubtractivePipe 分别映射独立、union 和 difference 模式。路径断开、分叉、连续重复点、多 profile transition 和 Base 缺失都会显式失败;三模式及失败保留 last-valid Shape 已有 Facade 回归,合法/恶意 Pipe 输入也纳入固定种子 geometry fuzz。

Chrome 150 内核门禁 test:chrome-geometry-features 现在真实执行 5 个 Bitbybit 操作:普通 Loft、Ruled Loft、Additive Loft、Subtractive Loft 和规则多边形 Pipe。每个结果都经过 Bitbybit mesh 非空检查7 个 Facade-owned ShapeHandle 的 shapeCount/kernelReferenceCount 从 7/7 释放到 0/0页面异常为 0。由于 Bitbybit 1.1.1 reserved deletion 对 operation 临时指针会破坏输入缓存,运行时不主动删除这些 operation input依赖 Worker cache sweep 和 Facade handle release这不是已完成的长时内核内存门禁需后续补版本兼容的 worker cache 生命周期证据。

同一 Chrome 150 门禁已扩展到独立 Extrude/Revolution 以及稳定选边 Fillet/Chamfer共真实执行 9 个 Bitbybit 操作;结果 mesh 均非空13 个 Facade ShapeHandle 与 12 个 kernel reference 在释放后均为 0页面异常为 0。Fillet/Chamfer 重算会把单个或多个稳定 TopoRef 解析到当前 edge index缺失、歧义、删除和遗留瞬时边名均产生硬诊断UseAllEdges 保持显式全边模式。

61. 2026-08-04 FCStd native property XML increment

App::PropertyLinkSub 已支持同一对象的多 sub-element并使用 FreeCAD 原生 LinkSub value/count + Sub 子节点;迁移与候选修复可定位单个稳定 TopoRef依赖图按每项引用收集OPFS 保存/恢复保持完整结构。App::PropertyLinkLinkListVectorPlacement 也改用对应原生 XML 节点和属性reader 继续兼容旧 JSON/string 编码count、有限数、零轴和零四元数均有显式失败。上述增量推进 FC-04/FC-06但尚未满足完整 FreeCAD 可重算 round-trip 验收。

62. 2026-08-04 P5 Part/PartDesign task workflow increment

Part 工作台的 Part::Fillet/Part::Chamfer 已接入稳定 edge 选择:命令状态拒绝无 edge、歧义或删除选择任务提交保存版本化 TopoRef,重算复用 Bitbybit fillet/chamfer 并把当前 edge persistentId 映射为 kernel indexPart 对象保持文档顶层且不改写 Body Tip。Part 工作台的 Part::Loft/Part::Sweep 和 PartDesign 的 Additive/SubtractiveLoft/Pipe 也已接入任务工厂,分别保存 SectionsProfile/Sections/Spine/Base,提交前校验 section 数量、唯一性、Sketch 类型和 profile/path 分离。LinkList 依赖图现在按每个链接建立 DAG 边,保证 Loft 多截面变更会传播到重算闭包。

Facade 命令回归达到 120/120覆盖无效任务拒绝、Part 顶层归属、PartDesign Tip 顺序、Base 依赖和 Bitbybit 执行分发。Chrome 150 应用门禁新增真实 PartDesign Loft section 控件:sqlite-opfs 持久化、Bitbybit WebGL canvas、桌面/移动布局和页面异常均通过section 列表控件和右侧任务面板横向溢出均为 0。多截面实际几何提交与 transition/advanced Pipe 的 FreeCAD oracle 对照仍属于 PD-LOFT/PART-ALL 后续验收。

63. 2026-08-04 PD-DRESSUP Draft/Thickness increment

PartDesign Draft 与 Thickness 已接入 Facade 类型合同、Bitbybit OCCT Worker 和 Recompute Engine。Draft 使用 occt.draft.draftAngle,将当前 Base 面的稳定 TopoRef 解析为 kernel face index并传递 Angle、Direction、NeutralPlaneOrigin、NeutralPlaneDirection 和 Reversed无拓扑、遗留瞬时面名、歧义/删除/缺失面都会产生硬诊断。

Thickness 不再把封闭 solid 直接交给 makeThickSolidSimple 后假设成功。FreeCAD 风格 RemoveFaces 现在必须是当前 Base 上的稳定面 TopoRef重算把它解析为面 index 并调用 Bitbybit operations.makeThickSolidByJoinArc/Intersection 两种 join 明确映射,未知模式直接拒绝。没有移除面的 Thickness 任务在命令状态层禁用,避免生成不可重算对象。

命令任务已注册 Draft/Thickness 的 Angle/Value 属性、稳定面前置条件和 Body Tip 更新Thickness 的 Base solid 仍为普通 LinkRemoveFaces 保留原生 LinkSub。Facade 回归现为 122/122覆盖 validator、稳定 face 解析、Bitbybit 调用参数、缺失面/非法 join 诊断和命令任务属性。Chrome 150 几何门禁现在真实执行 11 个操作(含 draft-selected-facethickness),所有 mesh 非空17 个 ShapeHandle/15 个 kernel reference 在释放后回到 0/0页面异常为 0。计划计数保持 30 completed、21 in_progress、32 pending、0 blockedPD-DRESSUP 的完整 FreeCAD oracle、高级 Thickness 参数及跨版本兼容仍未宣称完成。

64. 2026-08-04 PD-BASE parameter safety increment

Pad/Pocket/Revolution/Groove 重算现在对 Bitbybit 不等价的 FreeCAD 参数显式设门Pad/Pocket 的 Through-all/Up-to-face 与 taper 仍返回稳定诊断不再静默忽略。可由基元精确组合的双向语义已关闭该缺口的一部分Part Extrude.LengthRev 使用两次反向 geometry.extrudeunionPart Revolution.Symmetric 使用正反轴半角 geometry.revolutionunionPartDesign Pad/Pocket 支持 SideType=Two sides 及旧 ?TwoLengthsPocket 两侧依次 Boolean CutPartDesign Revolution/Groove 的 MidplaneTwo angles/Angle2 现在分别执行正反轴两次 Revolution/GrooveRevolution 结果 FuseGroove 在同一 Base 上顺序 Cut每个临时 Shape 都在组合边界释放。To-last/To-first/Up-to-face、taper 和缺少支持面的模式仍硬诊断。新增属性模板覆盖这些参数,便于编辑、表达式和 FCStd typed XML 保持同一数据模型。Facade 回归和构建通过PD-BASE 仍需完整 To-face、taper 等 FreeCAD oracle 等价实现后才能关闭。

65. 2026-08-04 P5 Hole 原生语义组合增量

参考 FreeCAD PartDesign::Hole 的属性清册Hole 不再固定原点和 +Z 法向。Facade 现在保存 PositionDirectionReversedTypeDiameterDepth,并将位置/方向写入圆形切削 Profile 与 Bitbybit Pocket。Dimension/Through all 仍由统一 Pocket 合同执行,零方向、非法尺寸和未知孔深类型在 Worker 前产生硬诊断。

Bitbybit 1.1.1 没有名为 Hole 的高阶操作,但它提供圆柱、圆锥和 Boolean Cut因此 FreeCAD 的 HoleCutType=Counterbore/Countersink 被拆解为主圆柱孔加二次圆柱/圆锥刀具,DrillPoint=AngledTapered/TaperedAngle 也由底部/全长圆锥刀具组合。所有 Shape 仍由 Bitbybit OCCT Worker 创建和切除。锥度已按 FreeCAD 的 90 度直孔语义实现,小于/大于 90 度分别缩小/扩大孔底;DrillForDepth=true 会联立锥度和钻尖高度,缩短圆柱段,使声明 Depth 包含钻尖总深度。尺寸过短、非正孔底半径和退化角度在创建 Worker Shape 前硬失败。

任务面板已暴露孔位置、方向、反向、切削类型、锥度、钻尖深度模式和尺寸Facade 回归现为 124 项通过,并新增 Counterbore、Countersink、Counterdrill、方向/位置、Tapered、DrillForDepth 和螺纹硬诊断覆盖。Chrome 150 几何门禁现在包含上述 Hole 组合及双向 Extrude/Revolution/Pad/Pocket 组合,共 21 个操作的 mesh 均非空53 个 ShapeHandle/41 个 kernel reference 在释放后回到 0/0页面异常为 0。该增量关闭的是可由 Bitbybit 组合表达的 Hole 子集,不宣称 FreeCAD 的 Threaded/ModelThread、标准尺寸、Support/Profile 面定位和完整孔特征历史已完成。

66. 2026-08-04 P5 Pattern 原生模式增量

依据锁定的 FreeCAD FeatureLinearPattern/FeaturePolarPattern 源码Linear Pattern 增加 Mode=Extent/SpacingOffsetReversed 和第二方向 Direction2/Length2/Offset2/Occurrences2/Mode2/Reversed2Extent 按总 Length 在首末实例间分配Spacing 按 Offset 作为每步距离,第二方向按笛卡尔实例序列组合并限制总实例不超过 100Polar Pattern 增加 Mode=Extent/SpacingOffsetReversedExtent 保持总 Angle 语义Spacing 以 Offset 作为每步角度360 度总范围按 FreeCAD 规则折分。未知 Mode、零/负长度或 spacing 会在重算前产生稳定硬诊断。

任务面板和属性模板已同步这些原生字段,现有 whole-shape Bitbybit placement/union 执行链保持不变Linear/Polar 的反向轴、spacing 和第二方向回归覆盖;本节当时未覆盖的 SpacingPattern/Spacings 与 Originals 已在第 70 节补齐,稳定 LinkSub 轴线和局部特征历史仍未完成。计划计数仍保持 30 completed、21 in_progress、32 pending、0 blocked。

67. 2026-08-04 P5/P6 生命周期与 FCStd TypeId 增量

新增参数化生命周期回归:在 Facade 边界上执行创建/编辑、异步重算、Undo、保存、加载和再次重算检查 Body.Tip、Sketch Support、dirty/recompute 状态和项目快照一致Node 环境没有浏览器 Worker 时只验证文档语义Chrome Worker 门禁继续负责真实 ShapeHandle 数量与释放计数。Facade 回归现为 124 项通过PD-CLOSURE 仍保持 pending,直到 Chrome 端完整参数编辑回放和 FreeCAD oracle 对照补齐。

FCStd inspector 的 recognized TypeId 清单已覆盖当前 Facade 可执行的 Part 基础体/Boolean/Extrude/Revolution/Loft/Sweep/Fillet/Chamfer以及 PartDesign Pad/Pocket/Revolution/Groove/Loft/Pipe/Dress-up/Pattern/Hole未知第三方类型继续 proxyFeaturePython 继续 blocked脚本仍绝不执行。新增 vocabulary 回归确认 30 个已实现类型不会被误报成 proxy这推进 FC-04/FC-06 的 metadata 映射,但没有宣称完整 FreeCAD 可编辑 round-trip。

68. 2026-08-04 FreeCAD 双向组合语义增量

依据 FreeCAD 1.1.1 FeatureExtrude/FeaturePad/FeaturePocket 的源码枚举,统一识别 SideType=One side/Two sides/SymmetricType=Length 及旧归档 ?TwoLengths。两侧线性特征不再因为 Bitbybit 缺少高阶 TwoLengths 操作而失败:每侧各创建一个方向明确的 Bitbybit solid随后使用同一 unionOwnedShapes 组合边界合并并释放输入Pocket 则在同一 Base 上按方向顺序执行两次 Cut释放中间结果。Part Extrude 的 LengthRev 和 Part Revolution 的 Symmetric 采用同一组合策略。

新增回归覆盖双向 Pad/Pocket、旧 TwoLengths 兼容、Part Extrude LengthRev、Part Revolution Symmetric 及临时 Shape 释放。Chrome 几何门禁仍只使用 Chrome组合报告为 21 操作、53/41 到 0/0计划计数不因实验切片虚增仍为 30 completed、21 in_progress、32 pending、0 blocked。

69. 2026-08-04 PartDesign Revolution/Groove 双向语义增量

参考 FreeCAD PartDesign Revolution/Groove 的 MidplaneTwo anglesAngle2 属性Recompute Engine 现在把对称模式拆为正反轴两个半角操作,把 Two angles 拆为 AngleAngle2 两个方向的 Bitbybit RevolutionGroove 则在同一 Base 上顺序执行两个方向的 Bitbybit Groove Cut并释放中间 Shape。To lastTo firstUp to face 等依赖支持面的模式不再静默降级,统一返回硬诊断。

任务属性模板和任务面板已增加 Type、Reverse angle、Symmetric to planeFacade 回归覆盖 Revolution 对称/双角/非法角度和 Groove 双角/对称/支持面诊断。Chrome 几何门禁新增真实 revolution-two-angles 操作,共 22 个操作的 mesh 均非空56 个 ShapeHandle/44 个 kernel reference 在释放后回到 0/0页面异常为 0。该增量仍不宣称 Pad/Pocket taper、To-face 和完整 Groove 支持面语义已完成。

70. 2026-08-04 P5 Pattern 原生 Spacing/Originals 增量

依据 FreeCAD 1.1.1 FeatureLinearPatternFeaturePolarPattern 源码Linear/Polar 的 SpacingsSpacingPattern 已按“显式单项 > 周期模式 > 全局 Offset”累加Linear Extent、Polar 360 度 Extent 分别遵循 FreeCAD 的首末距离和避免重合末实例规则。PropertyFloatList 已加入 Facade 属性模型、编辑器和 FCStd 原生 FloatList count + Float XMLPropertyStringList 同步改为 StringList count + Stringreader 继续兼容旧 JSON 编码。

PartDesign Transformed.Originals 现在可为 Mirrored、MultiTransform、LinearPattern、PolarPattern 提供多个原始 Shape组合时只释放临时副本不释放文档缓存 Shape。TransformMode=Features 在当前 whole-shape Bitbybit 组合边界返回 TRANSFORM_MODE_UNSUPPORTED避免把局部特征历史伪装成全形状变换。Facade 回归增至 126 项通过Chrome 150 几何门禁新增非均匀 Linear/Polar pattern24 个操作 mesh 均非空64 个 ShapeHandle/52 个 kernel reference 释放后为 0/0pageErrors 为 0。

71. 2026-08-04 P6 FCStd 原生 Expression/LinkSubList 可加载增量

FCStd writer 不再把表达式写成普通 Property 的私有 expression 属性,而是生成 FreeCAD 原生 App::PropertyExpressionEngine,使用 ExpressionEngine count + Expression path/expression 映射reader 将映射安全投影回目标属性,仍兼容旧 Web 归档,但拒绝错误 count、空路径和重复路径。App::PropertyLinkSubList 同步贯通 Facade 结构化值、深拷贝、属性验证、依赖 DAG、TopoRef 迁移/候选修复和原生 LinkSubList count + Link obj/sub XML稳定 TopoRef 只写 persistentId不写 mesh index。

反向桌面 oracle 首次发现并修复 writer 的容器级兼容缺口:Document.xml 的文档 Properties、Objects、ObjectData 和每个对象 Properties 现在写入 FreeCAD 所需的 Count/TransientCount动态属性写入 group/doc/attr/ro/hide 元数据。锁定的 FreeCAD 1.1.1 已实际打开 Web writer 生成的 FCStd并读回对象 Pad,Body,Holder、Length=12、Width=6、表达式 Length = Width * 2,以及 Pad 的 Face1/Edge3 和 Body 整对象链接;桌面端将 Width 改为 7 后 recompute 得到 Length=14再保存的 FCStd 由 Web inspector 读回 Width=7、Length=14、原表达式和全部链接。Facade 回归现为 129/129生产 TypeScript/Vite 构建通过。

该增量证明上述 typed property 子集已具备 Web -> FreeCAD 的原生可加载证据,不等同于 FC-06 完成Sketcher 几何/约束 serializer、完整内置属性状态、Shape/BRep 质量/颜色、FreeCAD 重算后 Shape 对比及 FreeCAD -> Web -> FreeCAD 批量差异报告仍待完成。83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

72. 2026-08-04 FC-05 PropertyPartShape/BRep 双向资源增量

Part::PropertyPartShape 现在使用结构化 ShapeResourceValuewriter 生成 FreeCAD 原生 <Part ElementMap="..." file="..."/>,并要求 file 是同一 FCStd 归档内的安全 .brp/.brep entry绝对路径、路径穿越、非 BRep 扩展和悬空资源全部硬失败。reader 将 Part 指针解析为 shape resource并在归档清单阶段校验对象属性不会指向缺失文件Facade 属性编辑器显示资源路径但不执行外部文件。

锁定 FreeCAD 1.1.1 oracle 已读取 Web writer 生成的有效盒体 BRepShape.isNull=FalseisValid=True1 solid6 faces、体积约 24。FreeCAD 回写后的 FCStd 再由 Web inspector 读回 Box.Shape.brp、8863 bytes 和 ElementMapOPFS storeShapes 继续按内容寻址资源边界保存。Facade 回归升至 130/130FCStd parser fuzz 1000/1000生产构建通过。

该切片关闭的是 Shape 文件指针和资源引用安全边界,不宣称完成 OCCT Shape 重建、颜色/容差/质量属性、ElementMap 历史迁移或 100 模型 FCStd 质量黄金FC-05/FC-08 继续进行中。计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

73. 2026-08-04 FC-05 BRep 浏览器实例化与质量属性增量

project.fcstd.instantiateShape 现在先经过 FCStd ZIP 路径、大小、压缩率、XML 和 Part::PropertyPartShape 引用门禁,再以 fatal UTF-8 解码归档内 .brp/.brep 文本,最后只调用 Bitbybit geometry.importShape(format=brep) 创建文档版本化 ShapeHandle。悬空路径、未被 Shape 属性引用的资源、空 payload、非法 UTF-8、预取消均不会进入 Worker若导入完成时才收到取消实例化器会先通过 Facade release 回收新 Handle 再返回 AbortError

Bitbybit Worker 同步增加 WriteBREPToString 导出和 OCCT 质量属性查询Facade 暴露 geometry.exportBrepgeometry.massProperties没有增加第二套几何实现。Chrome 150 唯一浏览器门禁已实际创建 2x3x4 Box、导出 2573-byte BRep、写入 Part/Box.Shape.brp、经 FCStd 引用重建并检查 6 faces / 12 edges / 8 vertices源与重建 Shape 的体积均为 24、表面积均为 52、质心逐分量一致。空资源、预取消、晚取消回收均通过25 个报告操作涉及的 66 个 ShapeHandle / 54 个 kernel reference 最终释放为 0/0pageErrors 为 0。

Facade 回归现为 131/131生产构建通过。该增量补齐单模型浏览器 Shape 重建、拓扑和质量属性证据FC-05 仍保持 in_progress,直到 GuiDocument 颜色/显示映射、容差报告、ElementMap 历史与 100 模型黄金完成。83 项计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

74. 2026-08-04 FC-04/FC-05 原生 GuiDocument 显示映射增量

锁定 FreeCAD 1.1.1 样例确认真实 GuiDocument.xml 根是 <Document SchemaVersion="1">,显示对象存于 ViewProviderData/ViewProvider/Properties,而不是早期 Web 内部的 <GuiDocument><Views> 结构。Inspector 现在同时兼容两个根:原生路径校验 ViewProviderData Count、ViewProvider/Properties Count、对象名唯一性、Camera 之外的 XML 节点和外部资源;旧 <GuiDocument> 仍只读保留,便于历史 Web 归档迁移。

writer 默认将 scope=data 留在 Document.xml,将 scope=view 分离写入原生 ViewProvider。它不再伪造 Extensions 属性FreeCAD 看到该属性就会强制读取不存在的 Extensions 节点),并输出必需的空 Camera 节点;Deviation/LineWidth/PointSize 使用 FreeCAD 原生 App::PropertyFloatConstraint 类型。ShapeColor 按 FreeCAD 1.1.1 PropertyMaterialList Version 3 二进制布局生成 WebShapeAppearanceN 资源,保存 ambient/diffuse/specular/emissive、shininess、transparency 和 UTF-8 字段reader 将首个 diffuse 作为 ShapeColor并保留完整材质报告。

真实桌面 oracle 已用 xvfb-run 打开 Web writer 生成的 Part::Feature FCStdGuiDocument.xml 读取错误FreeCAD ViewObject 读回 Visibility=false、Transparency=35、LineColor=(0.0666667,0.1333333,0.2)、PointColor=(0.2666667,0.3333333,0.4)、ShapeColor=(0.3411765,0.6039216,0.6117647)、Deviation=0.2。FreeCAD resave 后的 ShapeAppearance、LineColorArray、PointColorArray 和完整 23 项 ViewProvider 又被 Web inspector 读回,颜色/材质逐项保持。

Facade 回归仍为 132/132真实 PartDesignExample.FCStd 解析 17 个 ViewProvider、21 个 Shape 资源,生产构建通过。该增量关闭原生 GuiDocument 显示/颜色映射,不宣称完成 ElementMap2 历史迁移、容差批量差异和 100 模型 FCStd 黄金FC-04/FC-05 继续 in_progress。83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

75. 2026-08-04 FC-05 ElementMap2 拓扑历史资源增量

FCStd Part::PropertyPartShape 现在保留原生 <ElementMap2 file="..."/> 指针,并将 ShapeResourceValue.elementMapResource 纳入 Facade 类型、writer、reader、BRep 实例化引用和安全校验。写出要求 .Map.txt 位于同一 FCStd ZIP 的 opaqueEntries 中;缺失、路径穿越、重复 ElementMap2、错误扩展名均在 ZIP 生成/解析前硬失败,避免拓扑历史退化为未声明附件。

Inspector 将 .Map.txt 标记为 topology-map,以 fatal UTF-8 读取 BeginElementMap v1/EndMap 帧,解析 PostfixCountMapCount 以及 Edge/Face/Vertex 的 NameCount,并按字节长度和稳定 FNV 内容 hash 输出 elementMapResources 摘要。锁定的 PartDesignExample.FCStd 已通过真实样例读取17 个对象、21 个 BRep、13 个被 Shape 属性引用的 ElementMap2首个 Body map 报告 PostfixCount=63MapCount=2 及 Edge/Face/Vertex 名称计数;浏览器仍只使用 Chrome/Bitbybit未引入第二套几何实现。

Facade 回归升至 133/133Chrome 150 几何门禁 25/25、ShapeHandle/kernel reference 释放后 0/0生产构建和 git diff --check 通过。该切片完成的是 ElementMap2 文件指针与格式摘要边界,不宣称已把 FreeCAD 历史 token 重建为可编辑 TopoRefFC-05/FC-06 的历史迁移、容差批量差异与 100 模型 FCStd 黄金继续 in_progress。83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

76. 2026-08-04 FC-05 原生 Shape/ElementMap 恢复链增量

进一步桌面对照发现,Part + ElementMap2 指针正确仍不足以保证 FreeCAD 恢复 Shape。writer 现完整保留 <ElementMap new/count><Element key/value>Part.HasherIndex 和文档级 StringHasher2 -> StringHasher.Table.txt,并自动写出锁定的 ProgramVersion、稳定非零对象 id、ObjectDepsTouchedUseHasher 与瞬态 _ElementMapVersion。reader 分别核对普通 Property Count_Property TransientCount,同时暴露 StringHasher 表的 byteLength/contentHash/status缺表、悬空映射和错误计数均硬失败。

FreeCAD 的 FCStd 嵌入资源按流顺序恢复,原先 Document.xml -> GuiDocument.xml -> BRep 会使 PropertyPartShape 得到 invalid Shape。writer 已固定为 Document.xml -> StringHasher/BRep/ElementMap2 数据资源 -> GuiDocument.xml -> GUI 资源,并要求原生 .Shape.brp/.brep basename 与对象名一致。对应回归直接检查 ZIP entry 顺序,不再只检查文件存在。

锁定 FreeCAD 1.1.1 已无读取警告打开 Web writer 生成的完整历史归档,Body.Shape 为非空有效 Shape、1 solid、23 faces、体积 583719.3669394433;桌面 resave 后 Web 又读回 HasherIndex=0ElementMap=1.15.70200.5Dummy -> DummyBody.Shape.Map.txt 的 PostfixCount=63/MapCount=2 和 StringHasher 表。Chrome 150 仍以 Bitbybit 为唯一几何入口25 个操作、BRep 6/12/8 拓扑与质量属性通过66/54 资源释放到 0/0Facade 133/133、构建和 diff 门禁通过。

该增量完成原生 Shape/ElementMap 文件恢复链和双向保存证据,但尚未把 FreeCAD 历史字符串 token 映射成 Web TopoRef 候选,也未完成 100 模型 FCStd 批量质量/容差黄金FC-05/FC-06 继续 in_progress83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

77. 2026-08-04 FCStd 原生桌面 oracle 自动门禁

新增 ./npmw run test:freecad-fcstd-native,把此前手工执行的 FreeCAD 1.1.1 验证固化为可重复门禁。脚本从锁定的 PartDesignExample.FCStd 取得 StringHasher、Body BRep 和 ElementMap2使用 Web writer 重新组装 FCStdxvfb-run 打开并保存,再由 Web inspector 读回。门禁拒绝 Invalid Document.xml、嵌入资源读取失败、重复内建属性等警告,并检查 Body 为有效非空 Shape、1 solid、23 faces、体积 583719.3669394433,回存后 HasherIndex、ElementMap、Dummy 映射、PostfixCount=63、MapCount=2 和 StringHasher 仍一致。桌面 oracle 配置已登记该命令,但便携的默认 verify 不强制存在本地 FreeCAD 安装缓存。

78. 2026-08-04 FC-04/FC-10 Part 参数化原生往返增量

FCStd writer 新增原生数据属性分类Part::Box/Cylinder/Sphere/Cone 的尺寸/角度以及 Part::Fuse/Cut/Common 的 Base/Tool 不再带动态 group/doc/attr/ro/hide 元数据Web 扩展属性仍明确按动态属性保存。Length/Angle/Float 统一使用 FreeCAD 原生 <Float>Percent/Integer 使用 <Integer>String/Bool 使用对应原生节点NaN、非安全整数和 0..100 外百分比在生成 ZIP 前硬失败。ObjectDeps 现在来自文档依赖图并拒绝悬空对象,不再固定写 Count=0。

数据侧 Enumeration 改为索引式 Integer动态枚举写入 CustomEnumListreader 校验 count 并恢复选项标签。锁定桌面 FreeCAD 已从同一个 Web FCStd 重算四基元和三 BooleanBox/Cylinder/Sphere/Cone 体积与声明参数一致Fuse/Cut/Common 分别得到 24/23/1 的体积,所有结果均为有效单 solid动态 WebMode=ManufacturingWebProgress=35 可读取。FreeCAD 保存回来后 Web 又恢复 8 个对象、所有 Base/Tool、枚举/百分比和 8 个可用 Shape 资源。Facade 回归现为 137/137生产构建通过。该切片推进 FC-04/FC-10但 PartDesign/Sketcher 的完整原生内建属性、100 模型批量报告仍未完成,因此计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

79. 2026-08-04 FC-06 Sketcher 原生 FCStd 往返增量

FCStd writer 现在从 DocumentObjectSnapshot.sketch 生成 FreeCAD 原生 Part::PropertyGeometryList/GeometryListSketcher::PropertyConstraintList/ConstraintList。几何覆盖 Point、LineSegment、Circle、ArcOfCircle、Ellipse 和 BSplineCurve包含构造标志、B 样条 pole/weight/knot multiplicity 与确定性 native id隐藏的 WebGeometryIds StringList 保留 Web 字符串 IDFreeCAD 回存后可恢复约束引用。约束覆盖 Coincident、Horizontal、Vertical、Parallel、Tangent、Distance/DistanceX/DistanceY、Angle、Perpendicular、Radius、Equal、PointOnObject、Symmetric、Block 和 Diameter引用尺寸通过 IsDriving=0 往返。

真实桌面门禁发现 FreeCAD 会在非尺寸约束被错误标记为 reference 时于 updateNonDrivingConstraints() 解引用空值并崩溃writer 现拒绝该组合,只允许带 Value 的尺寸约束为 reference。reader 同时支持 FreeCAD 回存 Shape 使用的文档内联/声明式 StringHasher不再错误要求所有 HasherIndex 都必须有外部 StringHasher2 文件;有效的外部 StringHasher2 缺失仍会硬失败。未知 FreeCAD Sketch 几何保留为 raw typed property 并不伪装成可编辑 Web Sketch。

锁定 FreeCAD 1.1.1 已打开 Web 生成的 Sketch恢复并重算 10 个几何含点、线、圆、圆弧、椭圆、B 样条、10 个约束、1 个构造几何和 1 个 reference Radius回存后 Web inspector 恢复全部 geometry/constraint ID 与构造状态。Facade 回归现为 138/138生产构建通过。外部几何以及 Weight、SnellsLaw、InternalAlignment 尚未具备无损原生映射writer 明确拒绝;因此 FC-06 仍保持 pending83 项计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

80. 2026-08-04 FC-06 Sketcher ExternalGeo 原生往返增量

FCStd writer 现在为 Web Sketch 外部投影生成 FreeCAD 原生 ExternalGeometryApp::PropertyLinkSubList)、ExternalTypesApp::PropertyIntegerList)和 ExternalGeoPart::PropertyGeometryList)。ExternalGeo 包含 FreeCAD 必需的 H/V 轴线、SketchGeometryExtensionExternalGeometryExtension Ref/Flags/RefIndex 以及只读构造投影native geometry id 与内部几何共享单调编号,避免恢复时被 FreeCAD 重编号。隐藏的 WebExternalIdsWebExternalProjectionIds 和 URI 编码 WebExternalSources 保留 Web 外部对象 ID、投影 ID 及完整 TopoRef topologyVersion/generation/signature/candidates。

当前无损写出边界只放行 stable 状态且指向同一文档已声明对象的原生 EdgeN/VertexNVertex 必须对应点投影Edge 必须对应曲线投影。未声明对象、自引用、ambiguous/new/deleted、FaceN、Web 稳定 token 和非法版本全部在生成 ZIP 前硬失败。原因是 FreeCAD 面投影及部分复杂边可产生一对多几何,而现有 SketchExternalGeometry 是一对一模型在扩展数据模型前不会伪装成无损支持。reader 校验 IntegerList/count、三组隐藏元数据完整性和 native link 一致性FreeCAD 新拓扑命名或 defining/intersection 等当前模型不能表达的原生外部几何保留为 typed proxy不阻断整个 FCStd 导入。

锁定 FreeCAD 1.1.1 已打开并重算 Web 生成的 Part::Box + SketchSketch 保持 10 个内部几何、11 个约束,其中 PointOnObject 原生引用外部投影;ExternalGeometry=1ExternalTypes=[0]ExternalGeo=3(两轴加 ExternalBox.Edge1 投影)。桌面回存后 Web inspector 恢复 external-box-edgeexternal-box-edge-projection 和 topologyVersion=3/generation=2/signature 的完整 TopoRef。Facade 回归升至 139/139FCStd parser fuzz 1000/1000、生产构建通过。

该增量关闭单一 Edge/Vertex projection 的原生双向证据,不宣称完成 Face 一对多投影、intersection/both、defining/frozen flags、FreeCAD 新命名 token 写出或 Weight/SnellsLaw/InternalAlignment。FC-06 受 TSN-08、SK-12、FC-04 依赖仍保持 pending83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

81. 2026-08-04 FC-06 Sketch Attachment 原生往返增量

FCStd writer 现在把 Web Sketch 的 SupportMapModeAttachmentOffset 转为现代 FreeCAD 原生字段:AttachmentSupport 使用 App::PropertyLinkSubListAttachmentOffset 使用原生 PlacementMapMode 使用 FreeCAD 永久枚举索引。该映射不再错误沿用 Web 短枚举的数组位置;例如 FlatFace 在 FreeCAD 1.1.1 中明确写为索引 5而不是 Web 列表中的索引 4。当前 Web 实现范围只放行 Deactivated、ObjectXY/XZ/YZ、FlatFace、NormalToEdge并分别校验 whole-object、FaceN、EdgeN 支撑形态。

结构化 Support 的 TopoRef 必须指向同一文档已声明对象,且状态为 stable、版本非负、persistentId 与 face/edge/vertex 类型一致未声明对象、自引用、ambiguous/new/deleted、非原生 token、FlatFace 配 Edge 或 NormalToEdge 配 Face 均在生成 ZIP 前硬失败。隐藏的 WebSupportValue 使用 URI 编码 JSON 保留 topologyVersion、generation、signature、candidatesFreeCAD 另存后 reader 会先核对原生 AttachmentSupport再恢复完整 Web TopoRef。历史 Facade 默认的未声明 XY_Plane + Deactivated 只保留为 Web 兼容元数据,不伪造悬空 FreeCAD Link。

锁定 FreeCAD 1.1.1 已实际打开、重算并另存 Web 生成的 ExternalBox + SketchMapMode=FlatFaceAttachmentSupport=ExternalBox.Face1、AttachmentOffset Z=0.25 mm同时保留 10 个内部几何、11 个约束、1 个外部 Edge1 投影和外部 PointOnObject 约束。回存 FCStd 由 Web inspector 解码原生字段,并从隐藏元数据精确恢复 Face1 的 topologyVersion=3、generation=2 和 signature。Facade 回归升至 140/140桌面 oracle 与生产构建通过。

该增量关闭当前六种 Web Attachment 模式的 FCStd 边界证据,不宣称完整 FreeCAD AttachEngine 的 56 种模式、多引用 ThreePoints/Intersection 支撑、MapReversed/MapPathParameter 或局部 Attachment 几何执行全部等价。FC-06 仍受 Face 多投影、高级 Sketch 约束和批量 FCStd 黄金约束83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

82. 2026-08-04 FC-06 Sketcher SnellsLaw/Weight 原生往返增量

SnellsLaw 不再使用会丢失端点位置的两几何简化代理。Sketch 模型和 FCStd codec 现在保存两条 ray 的明确端点、第三条 boundary curve、折射率数值和 driving 状态,并映射为 FreeCAD Type=16 的三组 ElementIds/ElementPositions。锁定 FreeCAD 1.1.1 已打开、重算并另存三条 line 和一个 SnellsLaw 约束;桌面报告原生类型 SnellsLawWeb 回读精确恢复两个端点、boundary 和 1.2 数值。旧的不完整快照仍可读取,但原生写出会硬拒绝,避免伪装成无损格式。

B-spline Weight 现在按 FreeCAD 原生内部几何模型写出:每个被约束 pole 生成一个 Part::GeomCircleinternalGeometryType=9 的构造辅助几何,以 InternalAlignment(Type=15, InternalAlignmentType=9, InternalAlignmentIndex=pole) 绑定 B-spline再以 Weight(Type=19) 约束辅助圆半径。仅有 Weight 时 writer 生成带稳定名称的隐藏对齐约束,并用 WebSyntheticConstraintIds 标记;显式 bspline-control-point 对齐则直接往返。reader 保留原生 GeometryList 索引以解析约束,但只向 Web 暴露可编辑 B-spline核对辅助圆、端点位置和 pole 范围后剔除合成约束。重复 Weight、越界 pole、非正权重和当前无法无损表达的 knot/ellipse 内部对齐均在写出前硬失败。

锁定 FreeCAD 1.1.1 的 Weight oracle 已实际恢复 2 个原生几何B-spline 加内部圆、2 个原生约束InternalAlignment 加 Weight和内部构造索引 1桌面另存后 Web 恢复 1 条稳定 ID 的 B-spline 与 middle-weight=0.75不泄漏合成对齐项。Facade 回归升至 142/142桌面 FCStd oracle和生产构建通过。FC-06 仍需 ellipse/knot 内部对齐、Face 多投影、完整批量 golden 和依赖门关闭83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

83. 2026-08-04 FC-06 Sketcher 完整现有 InternalAlignment 模型增量

继续依据锁定 FreeCAD 1.1.1 SketchObject::exposeInternalGeometryForTypeConstraint::Save 源码FCStd codec 已覆盖 Web Sketch 模型当前声明的全部内部对齐:ellipse-major/minor 分别生成 Part::GeomLineSegment + internalGeometryType=1/2ellipse-focus 的索引 0/1 分别生成 Part::GeomPoint + type=3/4bspline-knot 生成 Part::GeomPoint + type=10。椭圆辅助几何由 center、rotation、长短半径精确求出B-spline knot 以 expanded knot multiplicity 得到唯一 knot 序列,再用有理 de Boor 在目标参数求值,不依赖网格近似或第二套几何内核。

reader 现在要求每个内部辅助几何都有匹配的 InternalAlignment,并逐项核对 helper 类型、internalGeometryType、FirstPos、目标几何类型、native index 和 B-spline pole/knot 范围Web 不支持的 Hyperbola/Parabola 内部类型保留为不可编辑 proxy不会被静默丢弃。WebSyntheticConstraintIds 也要求唯一、存在且只指向 B-spline control-point 对齐,缺失、重复或冒充其他约束会硬失败。

锁定 FreeCAD 1.1.1 已实际打开、重算并另存包含旋转椭圆、rational B-spline、中间 knot、4 种椭圆内部元素和 knot point 的 Web FCStd。桌面报告 7 个原生几何、5 个 InternalAlignment、构造索引 [2,3,4,5,6];回存后 Web 精确恢复 2 个可编辑几何和全部 5 条语义约束不暴露辅助元素。Facade 回归升至 143/143桌面 oracle 与生产构建通过。FC-06 后续仍是 Face 一对多外部投影、批量 FCStd golden 与上游依赖门83 项执行计划状态保持 30 completed、21 in_progress、32 pending、0 blocked。

84. 2026-08-04 FC-06 Sketcher Face 一对多 ExternalGeo 增量

真实 FreeCAD 1.1.1 源码和归档确认 Face 投影是分组关系:一个 ExternalGeometry LinkSub 和一个 ExternalTypes=Projection 可以对应多个 ExternalGeo 几何,每个投影共享同一 ExternalGeometryExtension.Ref/RefIndex,约束仍以各自的负 GeoId 引用。Web 模型无需破坏性迁移,现允许多个 SketchExternalGeometry record 共享完全相同的 stable Face TopoRefwriter 按 object/sub-element 分组,只写一条 Face Link 与 Type同时保留每条 projection 的 Web ID、projection ID 和完整 TopoRef 元数据。Edge/Vertex 仍要求一条 Link 对一条投影Face/Edge 只接受曲线Vertex 只接受点。

reader 不再错误要求 ExternalGeo.length === ExternalGeometry.length,而是校验每个 link 至少有一条投影、非 Face 分组恰好一条、flags 仍为当前支持的 Projection=0、每组 Web TopoRef 元数据一致。FreeCAD 新拓扑命名 token 可能使 ExternalGeo.Ref 不等于 LinkSub 中的旧 FaceN/EdgeN;存在 RefIndex 时以它为权威,缺失时按相同 Ref 的投影组和首次出现顺序回退,兼容锁定示例与 Web writer 档案。

锁定桌面 FreeCAD 已打开、重算并另存 Part::Box.Face6 + Sketch1 个可编辑点、1 个 PointOnObject、1 条 Face6 link、ExternalTypes=[0]ExternalGeo=6两轴加四边。Web 回读恢复 face-left/top/right/bottom 四个 ID、四个 projection ID、topologyVersion=5、generation=4 和 signature约束仍引用第一条投影。Facade 回归升至 144/144桌面 oracle 与生产构建通过。intersection/both、defining/frozen/sync flags 和新命名 token 的写出仍未纳入当前数据模型FC-06 及 83 项计划状态保持 30 completed、21 in_progress、32 pending、0 blocked。

85. 2026-08-04 FC-06 ExternalTypes 与状态位原生往返增量

Sketch 外部几何数据契约现在显式覆盖 FreeCAD 的三种组模式:projectionintersectionboth,分别原生映射为 ExternalTypes=0/1/2。同一 object/sub-element 的一对多投影必须共享模式、TopoRef 元数据和状态位Projection 继续执行 Vertex=点、Edge/Face=曲线以及非 Face 单投影约束Intersection/Both 则允许截面产生点、曲线或一对多结果。reader 使用 RefIndex 和组顺序恢复模式,不再把非零 ExternalTypes 降级成不可编辑 proxy。

SketchExternalGeometry 同时保存 Defining、Frozen、Detached、Missing、Sync 五个 FreeCAD 原生位FCStd 中精确编码为 Flags 的 bit 0..4。未知高位、非整数、同组位冲突以及未 Frozen 的 Sync 会硬失败;默认零值仍省略 Web 字段保持旧项目快照兼容。Sync 被明确建模为 Frozen 几何的一次同步请求桌面重算可以消费并清除此瞬态位Defining/Frozen 作为稳定状态精确另存回读。

锁定 FreeCAD 1.1.1 已实际打开、重算并另存 Web 生成的 ModeBox + ModeSketchFace1 Intersection 产生 1 条原生线Face6 Both 保留 4 条原生线Edge1 Frozen 保留 1 条原生线;桌面报告 ExternalTypes=[1,2,0]ExternalGeo=8(两轴加六条记录)、五条 Defining Flags=1 和一条 Frozen Flags=2。FreeCAD 将同一对象的三个 sub-element 在 Python PropertyLinkSubList 视图中聚合,但 FCStd reader 仍恢复六个 Web ID、六个 projection ID、intersection/both/projection 模式和完整 TopoRef。Facade 回归升至 145/145桌面 oracle 与生产构建通过。

该增量关闭 FC-06 当前 Sketch 模型中的 Projection/Intersection/Both 与五个状态位原生 codec不宣称浏览器已经用 Bitbybit 从任意 3D Shape 自动生成所有外部截面,也不宣称 FreeCAD 新拓扑命名 token 的原生写出完成。FC-06 仍受 SK-12、FC-04 和批量 FreeCAD-Web-FreeCAD golden 门依赖83 项执行计划状态保持 30 completed、21 in_progress、32 pending、0 blocked。

86. 2026-08-04 FC-10 FCStd 双向原生 round-trip 报告门禁增量

test:freecad-fcstd-native 不再只输出一次性控制台结果,而是生成确定性的 config/freecad-fcstd-roundtrip-verification.json。报告锁定 FreeCAD/Bitbybit 1.1.1 和 FreeCAD commit 0108fd4b4850cc46e625b60e53cea7a7bbe69f8d,逐场景记录方向、完整执行阶段、语义域、桌面版本、证据与差异;check:freecad-fcstd-roundtrip 要求未知差异一律阻断,并已接入默认 verify

首批矩阵包含 14 个真实桌面场景FreeCAD -> Web -> FreeCAD 的锁定 PartDesign Shape/ElementMap/StringHasher以及 Web -> FreeCAD -> Web 的 Box、Cylinder、Sphere、Cone、Fuse、Cut、Common、核心 Sketch/外部几何/Attachment、Face 一对多投影、Projection/Intersection/Both 与状态位、SnellsLaw、B-spline Weight 和五种 InternalAlignment。每条路径都包含实际打开、重算、另存和反向解析14/14 通过,未知差异为 0。

该门禁把当前原生覆盖从“脚本执行成功”提升为逐场景可审计报告,但不把首批 14 场景误报成 FC-10 所要求的完整批量语料或 100 模型容差矩阵也不改变尚未完成的计划项。83 项执行计划状态保持 30 completed、21 in_progress、32 pending、0 blocked。

87. 2026-08-04 FC-07/FC-10 只读 proxy 全归档字节保持增量

rewriteFcstdMetadataArchive 现在为 Inspector 生成的只读 proxy 文档提供严格无损路径:文档和 GuiDocument 均未修改时直接返回原始 FCStd 字节;标签、对象、属性或 GUI 覆盖发生任何变化都会硬失败。这样未知 Document.xml 节点、GuiDocument、脚本、插件私有资源、ZIP entry 元数据和顺序不会因为用 Web serializer 重建而静默丢失;可编辑文档仍使用原有的结构化 writer。

锁定的 PartDesignExample.FCStd 已作为第 15 个原生 round-trip 场景进入报告。该文件含 17 个对象,其中 8 个 App::Origin/Line/Plane/Point 当前按只读 proxy 管理49,349-byte 原档和 Web 透传归档的 SHA-256 同为 a8184e071ce36e22f6407dcb5d789946003dc0031dbdaf261130fb15171cf8ab。FreeCAD 1.1.1 已实际重新打开并另存透传档Body 仍为有效 23-face ShapeWeb 再解析仍得到 17 个对象和同样 8 个 proxy。Facade 回归升至 146/146FCStd 报告为 15/15、未知差异 0。

该能力刻意不允许编辑未知 proxy 后“尽力”重建 XML未知对象的可编辑合并需要面向各 TypeId 的结构化 codec。它补齐 FC-10 的 proxy byte-preservation 报告切片,但完整核心对象矩阵与 100 模型容差报告仍未完成,计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

88. 2026-08-05 FC-05/FC-10 Chrome 100 模型 FCStd BRep 质量与容差门禁

新增 BitbybitGeometryRuntime.qualityReport(),质量检查只通过 Bitbybit 1.1.1 的 OCCT Shape、BRepGraph、validate 和 bounding-box API 完成,不引入第二套浏览器几何入口。报告同时记录 Shape 类型、空 Shape、结构错误/警告、solid/face/edge/vertex 数量和包围盒;质量属性继续记录体积、表面积与质心。公开 Facade 类型新增 ShapeQualityReport,测试器不接触内核引用。

新增 test:chrome-fcstd-golden 和确定性 config/chrome-fcstd-golden-verification.json。Chrome 150 逐一执行锁定 FreeCAD 1.1.1 oracle 的 100 个模型Box 21、Cylinder 21、Sphere 16、Cone 16、Fuse 8、Cut 10、Common 8。每个场景均由 Bitbybit 创建 Shape、导出 BRep、写入带 Part::PropertyPartShape 的 FCStd、由 Web inspector 定位资源、再经同一 Bitbybit runtime 导入source/imported 分别与 FreeCAD 黄金以及彼此比较质量、质量属性、拓扑计数和声明容差。结果 100/100 通过、未知差异 020 条已知差异严格限定为 10 个 Cut 的 source/imported 容器类型由 FreeCAD Compound 归一化为 Bitbybit 单 Solid几何与计数无差异。总 FCStd 压缩字节 142071、BRep 字节 195457每个场景释放后及总门禁结束时 ShapeHandle/kernel reference 均为 0/0。默认 verify 已纳入报告检查;按项目约束仅运行 Chrome。

同一增量修正实际重算器的 FreeCAD 原生坐标约定:Part::Box 的 Length/Width/Height 对应 X/Y/ZBitbybit Box 参数按其 width/height/length 轴序重排且以 FreeCAD 原点放置Cylinder/Cone 明确沿 +Z。旋转角为零的 Part 基元 Placement 已直接折入创建中心,避免额外 Transform Shape非零旋转仍走统一 Placement。100 模型 Chrome 门禁另用真实产品重算器生成带平移 Box 和默认 Refine Cut二者均匹配相应 FreeCAD 黄金且探针释放为 0/0。Part::Fuse/Cut/Common 新增原生 Refine Bool默认 false 时保留边界true 时请求 Bitbybit 合并边界FCStd writer 将它作为内建属性输出不写动态属性元数据。Facade 回归为 146/146生产构建通过。

这批证据关闭了此前所列“100 模型 FCStd 批量质量/容差黄金”缺口,但 FC-05/FC-10 仍有完整 ElementMap 历史迁移和更广核心对象矩阵不能据此误报整项完成。83 项执行计划状态仍保持 30 completed、21 in_progress、32 pending、0 blocked。

89. 2026-08-05 PART-ALL Sphere 截取参数 Bitbybit 组合实现

Part::Sphere 现在显式保留 FreeCAD 原生 Angle1Angle2Angle3(默认 -90/90/360),并在 Facade 重算前校验纬度、方位角范围及上下界关系。Bitbybit 1.1.1 虽只提供完整球体构造,重算器已用现有 Bitbybit 操作补齐截取:完整球体先与按 sin(Angle1/Angle2) 定位的 Z 向 Box 相交,再与平面扇形 Extrude 形成的方位棱柱相交。扇形外包络半径为 2R,不会侵入球面;每次相交后立即释放前一 Shape 和工具 Shape。缺少 Bitbybit Extrude 时明确返回 SPHERE_TRIM_RUNTIME_UNAVAILABLE,非法输入分别报告 SPHERE_ANGLE1_INVALIDSPHERE_ANGLE2_INVALIDSPHERE_LATITUDE_RANGE_INVALIDSPHERE_ANGLE3_INVALID,不再静默退化为完整球体。

原生 FCStd 桌面往返报告扩为 16 个场景。新增 Web -> FreeCAD -> Web 的 Radius=5, Angle1=-45, Angle2=45, Angle3=120 截取球:锁定 FreeCAD 1.1.1 实际打开、重算、另存后得到 1 个有效 Solid体积和包围盒均与球带乘 120/360 的解析值一致,四个参数及 Shape 资源被 Web 再次恢复。Chrome 产品重算探针用同组参数执行真实 Facade + Bitbybit 组合路径,体积和包围盒匹配桌面结果,顶层 Compound 内仅含一个有效 Solid作为受限 kernel-container-normalization 差异记录;所有临时与缓存 Shape 释放后仍为 0/0。未引入第二套浏览器几何内核。

90. 2026-08-05 PART-ALL Torus 原生参数与 Chrome/桌面双门禁

Part::Torus 已进入 Facade、产品重算、任务面板和 FCStd 原生属性映射。参数覆盖 Radius1Radius2Angle1Angle2Angle3,默认值与 FreeCAD 一致Radius、轴向和 Angle3 在 Bitbybit 边界校验,非默认小圆裁剪角因 Bitbybit 1.1.1 未暴露对应稳定接口而明确返回 TORUS_MINOR_TRIM_UNSUPPORTED,不会静默生成错误 Shape。浏览器几何仍仅调用 Bitbybit createTorus,未引入第二内核或手写替代 BRep。

锁定 FreeCAD 1.1.1 已实际打开、重算并另存 Radius1=10, Radius2=2, Angle1=-180, Angle2=180, Angle3=270:结果为有效单 Solid、3 faces、体积 592.1762640653616,五个参数和 Shape 资源完整回读。原生 round-trip 报告扩为 17/17未知差异 0。桌面 Shape.BoundBox 的 X/Y 为 +-12.988706403508727Chrome Bitbybit 为 +-12.988706503508727;两者差异为 OCCT 拓扑容差 1e-7,已按 1e-6 场景容差通过。该事实纠正了把解析外径 12 错当成 FreeCAD BoundBox 的假设,质量报告最终保持完全使用 Bitbybit 的 BRep 包围盒结果。

Chrome 150 产品重算探针同时验证 Torus 结构有效、1 solid、3 faces、3 edges、2 vertices、体积/表面积/质心和包围盒,比较无已知或未知差异;释放后 ShapeHandle/kernel reference 为 0/0。100 个 FCStd+BRep 黄金模型继续 100/100 通过、未知差异 0。七条 Chrome runner 统一使用随机临时 profile 并在结束时删除,避免长期执行耗尽 /tmp;仍未运行 WebKit 或其他浏览器。Facade 146/146、桌面 FCStd 17/17、生产构建通过。该增量不宣称 PART-ALL 或 83 项计划整体完成,计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

91. 2026-08-05 PART-ALL Prism 原生参数与闭壳实体增量

Part::Prism 已进入 Facade 任务、属性面板、recompute、FCStd recognized TypeId 和原生数据属性映射。参数与 FreeCAD 1.1.1 保持同名同义:PolygonCircumradiusHeightFirstAngleSecondAngle;正多边形从 (Circumradius, 0, 0) 开始逆时针生成,顶面位移严格使用 [Height*tan(FirstAngle), Height*tan(SecondAngle), Height]。Polygon 被限制为 3..10000 的安全整数,半径/高度和两个 -89.99999..89.99999 角度在进入 Worker 前硬校验。FreeCAD resave 会把 Polygon 的类型提升为 App::PropertyIntegerConstraintFCStd decoder 现将该类型以及 App::PropertyFloatConstraint 作为有限数值恢复,不再退化为字符串。

Bitbybit 1.1.1 的普通 face extrusion 对正多边形返回缺顶盖的无效 Shape两截面 Loft 虽有正确拓扑但仍无法通过结构检查,因此最终实现没有接受这些结果。BitbybitGeometryRuntime.createPrism 改用同一 Bitbybit Worker 的公开 createPolygonWirecreateFaceFromWiresshapes.shell.sewFacesshapes.solid.fromClosedShell:底面/顶面按外法向反向,侧面逐边生成,闭壳后再创建 solid。浏览器没有直接调用 OCCT、自定义 BRep 或第二套内核Bitbybit 仍是唯一几何接口。

锁定 FreeCAD 1.1.1 已打开、重算并另存六边形 R=2/H=10/FirstAngle=10/SecondAngle=-51 solid、8 faces、体积 103.92304845413267、边界盒 [-2,-2.6069374428281185,0][3.76326980708465,1.7320508075688776,10],五个参数和 Shape 资源均由 Web 回读。原生 round-trip 报告升至 18/18、未知差异 0。Chrome 150 产品探针得到结构错误 0、8 faces/18 edges/12 vertices、体积 103.92304845413264,与桌面差异在 1e-6 门限内且无已知/未知差异100 个 FCStd+BRep 黄金场景继续 100/100 通过,释放后 ShapeHandle/kernel reference 为 0/0。Facade 146/146、生产构建通过未运行 WebKit 或其他浏览器。该增量推进 PART-ALL但尚未覆盖 Wedge 等其余 Part primitive83 项状态保持 30 completed、21 in_progress、32 pending、0 blocked。

92. 2026-08-05 PART-ALL Wedge 原生十参数与退化闭壳增量

Part::Wedge 已进入 Facade、Part 任务面板、mock 文档、recompute 和 FCStd recognized/native 属性映射。十个原生字段 Xmin/Ymin/Zmin/Z2min/X2min/Xmax/Ymax/Zmax/Z2max/X2max 按 FreeCAD BRepPrim_Wedge 语义保留Ymin/Ymax 两端是 XZ 矩形,主 X/Y/Z 跨度必须为正,远端 X2/Z2 跨度允许为零但不能为负。为匹配 FreeCAD 的有符号距离,公共文档 schema 新增 App::PropertyDistance,它允许合法负的 Xmin/Ymin/Zmin而不会放宽普通 Length。

Bitbybit 1.1.1 没有公开 Wedge convenience constructor因此 BitbybitGeometryRuntime.createWedge 仍只使用 Worker 的公开 createPolygonWirecreateFaceFromWiressewFacesfromClosedShell。实现连接两端矩形的六个定向平面面;当远端矩形退化为边或点时,连续重复点会被移除,零面积端面被省略,剩余三角/四边面重新 sew 成一个 solid。没有直接调用浏览器 OCCT、手写 BRep 或第二套几何入口Bitbybit 仍是唯一接口。

锁定 FreeCAD 1.1.1 已打开、重算并另存默认远端收缩 WedgeXmin/Ymin/Zmin=0X2min/Z2min=0Xmax/Ymax/Zmax=10X2max/Z2max=81 solid、6 faces、体积 813.3333333333333,十个 App::PropertyDistance 参数和 Shape 资源由 Web inspector 全部恢复。FCStd round-trip 报告由 18/18 扩为 19/19未知差异 0。

Chrome 150 产品重算探针使用同一十参数路径得到有效 solid、6 faces、12 edges、8 vertices体积 813.3333333333333,包围盒按 Bitbybit 容差为 [-1e-7,-1e-7,-1e-7][10.0000001,10.0000001,10.0000001],与桌面 oracle 无已知或未知差异ShapeHandle/kernel reference 释放后仍为 0/0。100 个 FCStd+BRep Chrome golden 场景继续 100/100、未知差异 0仅测试 Chrome未运行 WebKit 或其他浏览器。Facade 回归 146/146、生产构建通过。该增量关闭 Part Wedge 的原生参数/基础实体切片,但 PART-ALL 仍有其余 Part primitive 和高级功能83 项状态保持 30 completed、21 in_progress、32 pending、0 blocked。

93. 2026-08-05 PART-ALL Ellipsoid 原生参数与 OCCT GTransform 对齐增量

Part::Ellipsoid 已进入 Facade、Part 任务面板、mock 文档、recompute、FCStd recognized TypeId 和原生数据属性映射。六个 FreeCAD 字段 Radius1/Radius2/Radius3/Angle1/Angle2/Angle3 保持默认值 2/4/0/-90/90/360Radius1/2 必须为正Radius3 允许零(零按 FreeCAD 兼容规则复用 Radius2角度范围和上下界在进入 Worker 前硬校验。Bitbybit 运行时使用公开 createSpheretransforms.scale3d,明确拒绝当前未能无损表达的非默认椭球裁剪角并返回 ELLIPSOID_TRIM_UNSUPPORTED,不会静默生成完整椭球。

Chrome 150 实际产品重算证明 Bitbybit 的公开 scale3d 与 FreeCAD 1.1.1 的 BRepBuilderAPI_GTransform 产生相同 OCCT 控制网结果1 solid、1 face、3 edges、2 vertices体积 133.9826640573845,包围盒 [-8,-6.92820323027551,-2][4,6.928203230275507,2]。该包围盒并非理想解析椭球的对称范围,而是 FreeCAD/OCCT GTransform 表示的实际 BRep BoundBox黄金期望已锁定实测值未知差异为 0全部 ShapeHandle/kernel reference 释放后为 0/0。

FCStd 原生 round-trip 报告由 19/19 扩为 20/20FreeCAD 1.1.1 实际打开、重算、另存后六个参数、1 个有效 Solid 和 Shape 资源均由 Web inspector 恢复Ellipsoid 证据与桌面体积/包围盒一致。Facade 回归仍为 146/146生产构建通过100 个 FCStd+BRep Chrome golden 场景继续 100/100、未知差异 0。浏览器仍仅测试 Chrome未运行 WebKit 或其他浏览器;该增量不宣称 PART-ALL 或 83 项计划整体完成,状态保持 30 completed、21 in_progress、32 pending、0 blocked。

94. 2026-08-05 FC-04 PartDesign::Hole 原生字段 XML 边界增量

依据锁定 FreeCAD 1.1.1 PartDesign::Hole 构造函数的属性注册FCStd writer 现在把同名同类型的 Hole 字段写成原生属性:线程/标准选择、Diameter、HoleCut 参数、DepthType/Depth、DrillPoint、DrillPointAngle、DrillForDepth、Tapered/TaperedAngle、ThreadDepth 和 BaseProfileType 等不再附带 Web 动态 group/doc/attr 元数据。Enumeration 继续写 FreeCAD 原生整数索引Length/Angle/Bool 使用对应原生节点。

PositionDirection、Web 兼容的 Type 别名以及未在 FreeCAD FeatureHole 注册表中确认的扩展字段仍保留动态属性,避免将 Web 组合执行参数伪装成原生 Hole schema。该增量只关闭 XML 属性分类错误,未宣称 Threaded/ModelThread、标准尺寸、Support/Profile 面定位或完整 PartDesign Hole Shape round-trip 已完成Facade/Chrome 几何 Hole 子集继续沿用显式 HOLE_THREADING_UNSUPPORTED 等诊断。全量 verify 的 FCStd、Chrome、OPFS、Facade 和构建门禁保持通过83 项状态仍为 30 completed、21 in_progress、32 pending、0 blocked。

95. 2026-08-05 FC-04 Part Extrusion/Revolution 原生 TypeId 与 P06 字段边界增量

依据 FreeCAD 1.1.1 实际注册表Part 拉伸的规范 TypeId 已从历史误写的 Part::Extrude 更正为 Part::Extrusion。reader 仍接受旧别名作为迁移输入,但 writer 永远输出规范 TypeId避免生成 FreeCAD 无法实例化的对象。App::PropertyDistance 现按原生 Distance 节点编码;原生 Placement 写出 FreeCAD 所需的状态位Sketcher Placement 仍保留 Web AttachmentEngine 的既有边界语义。

Part::Extrusion 的 Base、Dir、DirMode、LengthFwd/LengthRev、Solid、Reversed、Symmetric 和双向 TaperAngle以及 Part::Revolution 的 Source、Base、Axis、Angle、Symmetric、Solid 已加入原生字段映射。锁定 FreeCAD 1.1.1 实际打开、重算并另存同一 Web FCStdExtrusion 得到 1 solid、体积 30Revolution 得到 1 solid、体积 36π;另存后规范 TypeId、Link、参数和 Shape 资源均由 Web inspector 恢复。FCStd round-trip 报告稳定为 22/22未知差异 0。

Part::LoftSections/Solid/Ruled/Closed/MaxDegree/LinearizePart::SweepSections/Spine/Solid/Frenet/Transition/Linearize 现按 FreeCAD 原生类型建模,其中 Spine 使用 whole-object App::PropertyLinkSub,空 sub-element 会生成依赖边。当前 Bitbybit 重算器只放行已验证的实体/变换子集Solid=false、Frenet、Linearize、非默认 MaxDegree、Spine 子元素等情况均返回明确诊断。Loft/Sweep 尚未取得稳定的原生几何黄金回放,因此不宣称完成其完整 Shape round-trip。

Facade 回归保持 146/146Chrome 150、OPFS、FCStd 22/22 与生产构建门禁继续作为验证入口;未运行 WebKit 或其他浏览器。该增量修正原生 TypeId 和字段边界,不改变 83 项执行计划计数,仍为 30 completed、21 in_progress、32 pending、0 blocked。

96. 2026-08-05 P06 IGES 原生导出闭环

Bitbybit OCCT Worker 新增 plugins.io.exportIges,直接调用公开 WriteIGESToStringFacade 暴露 exportIges 并校验 .iges/.igs 文件名和非空文本MockFacade 同步转发。Chrome 导出页面已启用 IGESGLB/Web CAD package 仍明确禁用。Chrome 150 E2E、OPFS 保存重开、Facade 146/146、FCStd 22/22、Chrome golden 100/100 和全量 verify 均通过,未知差异 0。83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

97. 2026-08-05 P06 Chrome IGES round-trip 证据

Chrome 几何特性 harness 现在对同一个 Bitbybit Box 同时执行 IGES 写出与 ReadIGESFromString 读回,记录非空 IGES 字节数、源/读回体积和拓扑数量。Chrome 150 实测源与读回体积均为 24,读回为 6 faces、24 edges、24 vertices边/点数量变化属于 IGES 参数化重建,不影响实体质量属性,且未发现未知差异。新增证据在释放后保持 ShapeHandle/kernel reference 0/0check:chrome-geometry-features 与全量 verify 通过。该增量不宣称 IGES 拓扑索引可直接作为稳定 TopoRef83 项计数保持 30 completed、21 in_progress、32 pending、0 blocked。

98. 2026-08-05 P06/QA-03 Chrome 导入格式工作流证据

Chrome E2E 新增 /projects → /import 导入工作流,锁定文件选择器接受 .FCStd/.fcstd/.step/.stp/.iges/.igs/.brep/.brp,页面显示 STEP、IGES、BREP、FCStd 交换边界;随后回到 OPFS 工作区继续导出和移动端布局检查。Chrome 150 页面异常为 0COOP/COEP、Canvas、OPFS 保存重开、STEP/IGES/STL/BREP 导出选择均通过;check:chrome-app-e2e 与全量 verify 通过。该证据只验证 UI 入口,不宣称导入格式已自动创建持久化 DocumentObject83 项计数保持 30 completed、21 in_progress、32 pending、0 blocked。

99. 2026-08-05 QA-08 Chrome 可访问名称门禁

Chrome E2E 在移动端起始页扫描所有可见 button/input/select/textarea 控件,要求每个控件具有 aria-labeltitle、文本或 placeholder 可访问名称。本次 Chrome 150 实测检查 15 个控件,缺失数量为 0页面异常为 0证据写入 config/chrome-app-e2e-verification.json,并由 check:chrome-app-e2e 与全量 verify 强制检查。该门禁只覆盖名称和当前页面状态,完整键盘顺序、焦点可见性、屏幕阅读器语义和国际化仍属于 QA-08 后续范围。

100. 2026-08-05 FC-08 100 模型 STEP/IGES/BREP 格式矩阵

Chrome FCStd golden harness 的 100 个锁定场景现在除 FCStd+BRep 严格 round-trip 外,还逐场景执行 STEP 与 IGES 写出、读回、质量属性比较和 Shape 释放。Box/Cylinder/Sphere/Cone 与 fuse/cut/common 共 100 场景全部通过,未知差异 0每个报告保存格式字节数、源/读回体积、实体数、ShapeType、结构错误数量和显式规范化分类。IGES 可能把实体容器读回为 compound、shell 或 faceSTEP/IGES 也可能报告 format-topology-normalization,这些差异不得用于稳定 TopoRef但体积必须在场景容差内且 Shape 非空。全部场景结束后 ShapeHandle/kernel reference 为 0/0,独立 checker 和全量 verify 通过。FC-08 仍需单位、颜色和完整容差报告后才能关闭。

101. 2026-08-05 FC-08 格式容差汇总门禁

100 模型报告新增机器可校验的 STEP/IGES 汇总。STEP 共 1,065,760 字节、100/100 通过,最大体积偏差 9.242739906767383e-10,读回均为 solidIGES 共 1,035,342 字节、100/100 通过,最大体积偏差 5.097643906992744e-8,读回为 84 compound 与 16 face。两种格式各有 84 个 format-topology-normalization,均被明确分类且不参与稳定 TopoRef。checker 会从 100 条逐项证据重新计算汇总并要求完全相等;全量 verify、构建和释放门禁通过。FC-08 仍需单位和颜色证据后才能关闭。

102. 2026-08-05 FC-08 STEP/IGES 单位声明门禁

每个 100 模型 STEP/IGES 交换记录现在解析导出文本中的单位声明STEP 要求 SI_UNIT(.MILLI.,.METRE.)IGES 要求 2HMM。两种格式 100/100 均明确声明毫米缺失单位会使该场景直接失败不再依赖默认单位推断。该切片与体积容差、拓扑规范化分类、Chrome-only Worker round-trip 和 0/0 释放门禁一起纳入全量 verify颜色/ViewProvider 传递仍需 FCStd/GuiDocument 专项证据FC-08 保持进行中。

103. 2026-08-05 QA-05 Chrome 几何 Worker 性能证据

Chrome geometry feature harness 现在记录 25 个真实 Bitbybit Worker 操作的 durationMs、平均操作时长和峰值 ShapeHandle 数量,并在 checker 中要求操作数与报告一致、计时有限且峰值不低于操作数。Chrome 150 本次实测总时长约 3064.31 ms、平均 122.57 ms、峰值 ShapeHandle 67,所有操作 mesh 非空,释放后 ShapeHandle/kernel reference 为 0/0。该切片建立 QA-05 的真实 Worker 基准格式,但尚未代表 1000 对象、百万三角形、大装配或长会话预算QA-05 继续保持 pending。

104. 2026-08-05 QA-05 Chrome 1000 对象压力切片

同一 Chrome 150 geometry harness 在 25 个特征操作后连续创建 1000 个独立 Part::Box Shape记录压力创建耗时和峰值生命周期。本次实测 1000 对象创建约 81.47 ms,峰值 ShapeHandle 1067(含前置特征对象),释放后 ShapeHandle/kernel reference 为 0/0Chrome checker、构建和全量 verify 均通过。该证据关闭 QA-05 的 1000 对象基线子项,但百万三角形、大装配、大表和长会话 P95/峰值预算仍未完成QA-05 不提前关闭。

105. 2026-08-05 REL-01 PWA/offline 最小发布门

应用新增 manifest.webmanifest、生产环境 service worker 注册和 bitbybit-cad-shell-v1 缓存策略。Service worker 安装时缓存 //index.html、manifest激活时清理旧版本并 claim clientsGET 请求采用 network-first网络失败回退缓存非 GET 和跨源请求不拦截。Chrome E2E 验证 manifest 200、/start start_url、/ scope、standalone displayCOOP/COEP、OPFS、Canvas 和页面异常继续通过;check:pwa 已纳入全量 verify。该切片只关闭 PWA 入口和基础离线回退,安装升级、真实断网恢复、缓存迁移和彩排仍属于 REL-01 后续。

106. 2026-08-05 REL-01 Chrome 真实断网回退证据

Chrome E2E 在生产 dist 上等待 service worker ready 后,通过 CDP Network.emulateNetworkConditions 切换 offline重新访问 /start;离线期间应用 shell、路由和 Start a new design. 标题仍可加载,随后恢复网络并继续完整工作流。报告记录 offline.path=/startshell=trueheading=true,页面异常为 0独立 Chrome checker 和全量 verify 通过。该切片关闭基础断网 shell 回退,仍需安装/升级、缓存版本迁移、SQLite/OPFS 离线写入与电源中断恢复彩排。

107. 2026-08-05 REL-01 service worker 缓存迁移静态门

check:pwa 现在强制检查 service worker 的缓存版本常量、旧 key 过滤和 caches.delete(key) 清理逻辑,同时保留 skipWaitingclients.claim、network-first 和缓存回退检查。这样升级到新 shell 版本时不会无限累积旧缓存;门禁已纳入全量 verify。真实安装升级和跨版本离线数据迁移仍需 REL-01/REL-02 专项彩排。

108. 2026-08-05 QA-08 Chrome Tab 焦点回放

Chrome E2E 在移动起始页真实发送 8 轮 Tab keyDown/keyUp记录 activeElement 的标签、可访问名称和可见性。8/8 焦点步骤均落在有名称的可见元素,未出现无名可见控件;结果写入 config/chrome-app-e2e-verification.json,由 checker 和全量 verify 强制检查。该切片覆盖核心页面的焦点命名和基本顺序,不宣称完整屏幕阅读器语义、焦点陷阱、所有工作台键盘映射或国际化。

109. 2026-08-05 REL-03 确定性 npm CycloneDX SBOM

新增 scripts/generate-sbom.mjsconfig/sbom.cdx.json 以及 generate:sbom/check:sbom。生成器只读取 package.jsonpackage-lock.json 和锁定安装中的 package manifest不联网、不引入第二套包管理器产物固定为 CycloneDX 1.5,按路径排序记录 172 个组件、版本、required/development/optional scope、SHA-512 integrity、npm 分发地址、依赖关系和 SPDX/声明许可证。SBOM metadata 同时绑定锁文件 SHA-256避免报告与锁定依赖脱节。

当前平台没有安装的 74 个依赖全部是其他操作系统的 optional esbuild 包,产物将其标为 not-installed-optional;已安装的 required/development 包若没有许可证声明会使 check:sbom 阻断。该增量建立可审计的依赖/许可证清单但不伪造漏洞扫描或签名证据REL-03 仍需发布环境的漏洞报告和密钥签名。

110. 2026-08-05 REL-03 dist 产物完整性清单

新增 scripts/generate-release-artifacts.mjsconfig/release-artifacts.json 以及 generate:release-artifacts/check:release-artifacts。构建后清单按 POSIX 相对路径排序记录 dist 的 24 个普通文件、字节数和 SHA-256并绑定 config/sbom.cdx.json 的 SHA-256发现 symlink、额外文件、缺失文件、大小或 hash 变化时直接失败。verify 现在在生产构建后执行该清单检查,防止部署包与审计报告漂移。

清单明确写入 signature.status=unsigned-development 和签名密钥需由发布环境提供;本地门禁不会把完整性 hash 冒充数字签名。REL-03 的真实签名、漏洞报告和发布密钥托管仍是未完成项。

111. 2026-08-05 REL-02 schema 迁移与回滚彩排

新增 scripts/run-project-migration-rehearsal.tsconfig/project-migration-verification.json。脚本对当前六个 schema migration 逐一起始版本执行 v1→v6 前向升级,验证已应用版本跳过、顺序、最终 schema、事务 commit 和固定迁移 hash另对每个迁移点注入失败验证整个事务 rollback、已应用版本恢复到失败前状态且不会误报 commit全量已应用版本再次运行验证幂等空操作。

check:project-migration 已纳入 verify,报告共 6 个前向起点、6 个失败回滚点和 1 个幂等重跑。该切片证明 Facade migration runner 的事务合同和回滚策略,不等同于真实旧版 SQLite/OPFS 文件、电源中断或发布包降级彩排Chrome OPFS 真实 v4→v5→v6 仍是 REL-02 的后续门禁。

112. 2026-08-05 QA-05 Chrome 高细分三角网格压力

Chrome geometry harness 在同一 Bitbybit Worker 中新增半径 100 的球面网格压力,固定 shapeToMesh precision 0.01,要求并记录至少 100,000 个三角形和对应顶点数、网格耗时及生命周期峰值。首次 0.001 百万三角形尝试在 180 秒浏览器预算内将 renderer 推至约 2.3 GB已作为超预算失败证据处理因此门禁采用受控的 100k 基线而不伪称百万三角形已完成。报告仍与前置 25 个特征操作和 1000 个独立 Box 压力共享 Worker所有 Shape 在结束后统一释放并要求 ShapeHandle/kernel reference 0/0checker 和全量 verify 强制检查三角形阈值及数值有效性。

该切片建立 QA-05 的高细分 Chrome 基线;百万三角形 P95/峰值内存、大装配、多标签长会话和大表格预算仍未完成QA-05 不提前关闭。

113. 2026-08-05 TSN-03 Chrome 原生 Boolean history Worker 回放

新增 chrome-native-history-harness.htmltest:chrome-native-history。Chrome 150 实际启动独立 NativeOcctHistoryWorkerProvider,由 Bitbybit Worker 导出两个 Box 的 STEP 文本,写入并清理 OPFS 标记文件,再交给 native/occt-history Embind WASM 执行 cutModified/Generated/Deleted 收集Facade 只接收版本化协议和映射后的稳定关系记录,不传递 ShapeHandle 指针。报告记录 provider 能力、OCCT 版本、关系计数和最终 ShapeHandle/kernel reference 0/0check:chrome-native-history 已纳入全量 verify

该证据关闭 native history 的 Chrome Worker/STEP/资源释放 Boolean 子项provider 能力仍只声明 fuse/cut/commonPartDesign Pad/Pocket/Loft/Pipe/Revolution 等特征的原生 Generated/Modified/Deleted 尚未实现TSN-03 继续保持进行中。

114. 2026-08-05 QA-07 CSP 与权限安全基线

新增 public/_headersconfig/security-baseline.jsonscripts/check-security-baseline.mjs。静态部署合同和 Vite preview 同时声明 COOP/COEP/CORP、CSPself-only、wasm-unsafe-eval、Worker blob、禁止 object/frame、无 unsafe-eval)以及关闭 camera/microphone/geolocation/payment 的 Permissions-Policychecker 还扫描 src 中的 dangerouslySetInnerHTMLnew Functioneval 动态执行入口。

该切片把 QA-07 的 CSP/权限与 Facade-only 源码边界变成机器门禁,仍不等同于插件沙箱、依赖漏洞扫描、恶意 Addon 和完整浏览器安全评审;发现 critical 时仍必须阻断发布。

115. 2026-08-05 REL-03 npm critical 漏洞报告

执行 npm audit --omit=dev --audit-level=critical --json,对锁定 package-lock.json 的 23 个生产依赖完成审计,当前 critical/high/moderate/low/info 均为 0。新增 config/npm-audit-critical.json 保存审计版本、依赖计数、漏洞对象和锁文件 SHA-256check:dependency-audit 只做离线一致性检查,锁文件变化或报告出现 critical 会阻断 verify,需要联网刷新时显式运行 test:dependency-audit

该报告是当前 npm advisory 服务快照不替代发布时重新执行的漏洞扫描、许可证法律审查或数字签名REL-03 的签名密钥和 SBOM 发布仍保持未完成状态。

116. 2026-08-05 QA-06 Chrome Worker/WASM/OPFS 故障注入

新增 chrome-fault-injection-harness.htmltest:chrome-fault-injectioncheck:chrome-fault-injection。Chrome 150 在真实 PlanegcsWorkerProvider 上先完成 planegcs WASM 求解,再通过可控 WorkerLike 包装器终止当前 Worker 并派发错误事件provider 将旧 Worker 清理、重建新 Worker 并重新初始化,第三个 Worker 恢复求解得到端点 (5, 0)。同一回放还验证 coordinator 的取消结果为 cancelled、文档版本变化结果为 stale,不会把过期解提交给文档。

故障注入期间在 Chrome OPFS 根目录创建零字节标记文件,读取确认后执行清理,并再次读取得到 NotFoundError3 个创建过的 Worker 在 provider dispose 后全部标记为已终止。报告固定 browserId=chromecrossOriginIsolated=trueSharedArrayBuffer=truechecker 已纳入全量 verify。该切片关闭 QA-06 的 Chrome Worker 取消/崩溃重建/stale/OPFS 临时资源子项真实电源断电、浏览器强杀、SQLite VFS 写入中断和跨版本 OPFS 数据迁移仍属于 QA-06/REL-02 后续,不提前宣称完成。

117. 2026-08-05 REL-02 Chrome 旧版 OPFS 实库迁移

SqliteProjectPersistence 增加可选 databasePath(默认仍为 /bitbybit-project.sqlite3),仅用于迁移彩排选择隔离的 OPFS SQLite 文件。新增 legacy seed Worker 使用同一 SQLite WASM OpfsDb 建立真实 schema v1写入旧版 projects/documents/objects/object_properties/resources 行和 bitbybit-assets 资源文件;正常 persistence Worker 随后在 Chrome 中执行 v2→v6 migration。

Chrome 150 实测从 schema v1 读取旧文档(版本 3、1 个对象),迁移后 schemaVersion=6,缺省 recompute_json 正确恢复为 idle先注入第 3 个 migration 失败SQLite 事务被拒绝且失败后实际 schema_migrations 仍只有 [1],没有留下 v2 的部分结构。随后用正常 Worker 完成迁移,更新到版本 4 后 dispose再以同一路径重开文档、checkpoint、SQLite integrity_check 和资源内容均保持,资源 release 后 OPFS 文件消失。报告最后删除隔离数据库文件并记录清理路径checker 已纳入 verify。该证据覆盖真实旧版 OPFS 文件的前向迁移、事务回滚、幂等重开和资源引用;断电中途的 SQLite VFS journal 恢复、跨发布版本降级和用户数据备份仍属于 REL-02 后续。

118. 2026-08-05 TSN-03 Chrome 原生 PartDesign Pad 最小 history

自构建 OCCT history WASM 新增 BRepPrimAPI_MakePrismprismHistory/prismHistoryFromStep,协议能力从 fuse/cut/common 扩为 fuse/cut/common/padPad 请求只携带 profile STEP 和有限非零 direction不伪造 Boolean tool。关系记录支持 resultKind:矩形 Face profile 的 4 个顶点保留并各生成一条 Edge4 条 profile Edge 各生成一个 Faceprofile Face 保留为结果 FaceChrome 150 Worker 回放共 25 条关系13 modified、12 generated、12 条跨 kind输出为有效 1 solid、6 faces、体积 30Worker dispose 完成。

该切片把原生 Generated/Modified/Deleted 合同真正延伸到一个已实现的 Pad/Prism 子集,并保留 STEP 跨 WASM 边界Pad 仍要求真实平面 Face profilesolid 会由 OCCT 明确拒绝。Pocket、双向/锥度 Pad、Support/Attachment 定位、Body/Tip 生命周期和 Loft/Pipe/Dress-up 等特征尚未接入自动重算TSN-03 继续保持进行中。

119. 2026-08-05 P05 Chrome 参数化生命周期增量

新增独立 Chrome PartDesign 生命周期门禁:通过 Facade 给 Sketch 写入闭合矩形,先抑制示例中尚无稳定 TopoRef 的 Pocket/Fillet 并验证 Body.Tip 重定向为 pad,再把 Pad.Length 从 42 mm 改为 31 mm等待 Bitbybit Worker 重算、Undo 回到 42 mm并再次重算。回放同时读取 Sketch.Support=XY_Plane,保存到 SQLite OPFS 后重新加载,再确认 42 mm 参数、Tip、Support 与抑制状态均保持一致;最后检查 ShapeHandle 和 kernel reference 都归零。命令层现在复用重算引擎的闭合轮廓判定;开放或空 Sketch 不再错误启用 Pad/Pocket/Revolution/Groove/Extrude而是在进入 Worker 前显示稳定的前置条件诊断。

该证据关闭了此前仅在 Node Facade 测试中存在、Chrome 端缺少编辑/重算/Undo/保存/加载串联的问题;任务提交创建仍由 Facade 回归覆盖。PD-CLOSURE 仍为 pendingPART-ALL、PD-LOFT、PD-TRANSFORM 依赖尚未关闭,完整 Chrome 创建链、全部 PartDesign 特征的原生历史、FreeCAD oracle 和失败时保留上一有效 Shape 仍需逐项补齐;计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

120. 2026-08-05 SK-06 planegcs Vertical 约束增量

锁定 FreeCAD 1.1.1 的 planegcs WASM Embind 适配新增 solveVerticalDistance,与既有 solveHorizontalDistance 共用同一 GCS::System::solve()/applySolution() 路径。Facade solvePlanegcsSubset 现在在单线段、一个 driving Vertical 和端点 Distance 的最小合同中调用原生 Vertical 求解;能力表升级为 1.1.1-embind-subset.2,明确声明 horizontalverticaldistance,仍拒绝多几何和未绑定高级约束。

Node smoke 与 Facade 回归覆盖 Horizontal/Vertical 两个方向并验证 Embind vector 释放。Chrome 150 专用 Worker 回放同时得到 Horizontal 端点 (5,0) 与 Vertical 端点 (0,5),两者求解状态为 0、残差为 0,并保留 completed/cancelled/recovered/stale 生命周期证据WASM 新哈希为 622b725bd86d304786b9046a879f7e7e85907890cc78c4527df0cd0f79b4698dartifact checker 和全量构建通过。SK-06 仍为 in_progress:完整约束图、尺寸/参考诊断、椭圆/B-spline/外部几何映射以及 FreeCAD 成功/失败 fixture 尚未完成;计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

121. 2026-08-05 SK-06 Block 约束自由度修正

Basic solver 的 Block 约束现在按被锁定几何的完整参数维度计入 rank点为 2、线为 4、圆为 3、圆弧/椭圆为 5B-spline 按控制点与权重参数计数。此前统一按每个 Block 加 2 会让被锁定线段或圆错误显示剩余 DOF新增 Facade 回归确认 blocked line/circle 均为 solveddegreesOfFreedom=0

Sketch solver fuzz 2000 模型/4000 次求解与 500 模型/1000 次压力回放均通过,确定性摘要更新为 55a6454b,最大残差 4.577566798522237e-16,意外状态与确定性差异均为 0。该修正只改善 Basic solver 的诊断计数,不冒充完整 planegcs rank/冗余分类SK-06 仍保持 in_progress,计划计数不变。

122. 2026-08-05 SK-06 planegcs Parallel/Perpendicular 双线约束增量

锁定 FreeCAD 1.1.1 的 planegcs WASM Embind 适配新增 solveParallelLinessolvePerpendicularLines。原生求解固定第一条线和第二条线起点只让第二条线方向收敛并保持给定长度返回向量包含两条线坐标、求解状态和归一化方向残差。Facade solvePlanegcsSubset 对外仍按两条线的 8 个几何参数计算 7 个剩余自由度,仅接受一个 driving Parallel 或 Perpendicular 关系,并拒绝退化线、额外 driving 约束和非线几何。

Node smoke 覆盖 Horizontal/Vertical/Parallel/Perpendicular 四种原生调用,四者求解状态均为 0、残差均为 0Parallel 第二条线收敛到 (0,2)->(5,2)Perpendicular 收敛到 (0,2)->(0,7)WASM artifact 新哈希为 9e056ae7776485910460e9222b4268d02e0e0396a7917e4a68a0d51b8f706343。Chrome 150 专用 Worker 与 Facade 回放验证同样的端点和资源释放,并保留 completed/cancelled/recovered/stale 生命周期证据;check:planegcs-artifactcheck:chrome-planegcs 和 Facade 149/149 回归通过。

该增量把 SK-06 的原生双线关系最小合同接入 Bitbybit Worker但不宣称完整约束图、尺寸/参考/冲突诊断、外部几何、B-spline 编辑或 FreeCAD 全量 fixture 已完成SK-06 仍保持 in_progress,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

123. 2026-08-05 TSN-03 Chrome 原生 PartDesign Pocket history

原生 OCCT history WASM 新增 pocketHistoryFromStepWorker 接收 base STEP、平面 profile STEP 和有限非零方向,先用 BRepPrimAPI_MakePrism 生成切削体,再用 BRepAlgoAPI_Cut 收集 base/profile 两侧的 Generated/Modified/Deleted。协议能力从 fuse/cut/common/pad 扩为 fuse/cut/common/pad/pocketFacade topologyHistory 和 STEP bridge 均强制校验两输入、方向和版本上下文ShapeHandle 不穿越 WASM仅传输 STEP 文本。

Chrome 150 回放先由 Bitbybit Worker 导入 base/profile STEP 并计算 Pocket再经原生 history Worker 回放,得到 42 条关系Base/Profile 均出现21 modified、21 deleted最终 Shape 合同有效且所有 ShapeHandle/kernel reference 为 0/0OPFS 临时标记创建、读取和清理也通过。Node native smoke、Facade 151/151、check:occt-history-artifactcheck:chrome-native-pocket-history 均通过OCCT artifact 新哈希为 JS 5d16c764150d21e221f45b9d4b28b215c9cb3a578e91cac5b41a0d333ed246f7、WASM 1a4da98416a1111f5e668bce37b9d1d4c191157c7267fe3b58494d327b2e6259

该切片把 PartDesign Pocket 的有限平面挤出子集接入原生 history不宣称 Through-all、Up-to-face、锥度、双向或完整 Support/Attachment、Body/Tip 自动历史已完成TSN-03、PD-BASE 仍保持进行中,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

124. 2026-08-05 TSN-03 Chrome 原生 PartDesign Revolution history

原生 OCCT history WASM 新增 revolutionHistoryFromStep,输入锁定为 profile STEP、有限 axis origin、非零 axis direction 和 (0,360] 度角;BRepPrimAPI_MakeRevol 直接收集 profile 顶点/边/面的 FirstShape、Generated 和 IsDeleted并为跨 kind 的 vertex→edge、edge→face 关系写入 resultKind。协议、Worker 能力与 Facade topologyHistory 扩为 revolution,无效轴、越界角度和非单 profile 输入在进入 WASM 前拒绝。

Node smoke 对 2×3 矩形围绕偏移 Y 轴执行 360° Revolution得到有效 1 solid、体积 75.3982236861550324π、23 条关系Modified/Generated/Deleted 均非空。Chrome 150 由 Bitbybit Worker 计算同一 Revolution再经原生 history Worker 回放,得到 10 modified、10 generated、3 deleted其中 10 条跨 kind结果结构有效、体积一致OPFS 临时标记清理后 ShapeHandle/kernel reference 为 0/0。Facade 153/153、Chrome checker 和 artifact checker 通过;最新 OCCT artifact 哈希为 JS 25abac1995427b1050b47bd2a6f14fa67db6a518376415e2732ea8bcca766a9d、WASM ca0ac6467e655dfa32da653b917baab219591b94fcb33a7aa561d241554f4cba

该切片只覆盖单 profile、单角度的原生 RevolutionTwo angles、Midplane、Support/Attachment 和 Groove 的 base-cut 历史尚未完成TSN-03、PD-BASE 仍保持 in_progress,计划计数不变。

125. 2026-08-05 TSN-03 Chrome 原生 PartDesign Groove history

原生 OCCT history WASM 新增 grooveHistory/grooveHistoryFromStep:先以给定 axis origin/direction 和 (0,360] 角度围绕 profile Face 生成旋转切削体,再由 BRepAlgoAPI_Cut 收集 base/profile 的 Modified/Generated/Deleted。协议、Direct provider、双 Worker、Facade STEP bridge 与 topologyHistory 均声明 groove;对于内部切削在 OCCT 不提供可比较的逐面 IsSame 时,保留一个明确的 face-level summary historyModified base face、Deleted profile face不会返回空历史。新增 makeRectangleFacePlaced fixture 绑定,避免基体边界共面导致退化。

Chrome 150 真实回放使用 Bitbybit Geometry Worker 创建 10×10×8 原点盒体和内部 1×3 profile执行 Grooveaxis [0,0,0]、direction [0,1,0]、360°再把 Bitbybit 导出的 Base/Profile STEP 交给原生 history Worker。结果 structuralValid=truestructuralErrors=0、1 solid、10 faces/18 edges/12 vertices、体积 781.1504440784611800 - 6πhistory 有 2 条关系Base 1 modified、Profile 1 deleted两侧 source 都出现。OPFS 标记文件创建、读取和删除通过,所有 ShapeHandle/kernel reference 最终为 0/0。Node native smoke 同时验证对象与 STEP 路径,原生 artifact hash 为 JS b36b7c294ee293bae262593a751d15d7d4d4f52ee53d10de1370ff596469e231、WASM 59c0bcc0ad48e0ea177ac65d792325ec4dd01557fc8741953d256550c31dbbf5check:chrome-native-groove-history 已纳入全量 verify

该切片只覆盖单 profile、完整角度、内部切削的 Groove 子集Two angles/Midplane、Support/AttachmentOffset、真实 TopoRef 迁移、局部坐标链和失败后保留上一有效 Shape 仍未完成。TSN-03、PD-BASE 继续保持 in_progress,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

126. 2026-08-05 SK-07 Chrome 尺寸/参考/冲突诊断增量

Basic Sketch solver 增加 dimensional 诊断合同:driving=false 的 distance/distanceX/distanceY/radius/diameter/angle 会产生明确的 REFERENCE_DIMENSION 只读诊断,不参与求解或 DOF同一几何/端点的同值 driving dimension 分类为 REDUNDANT_CONSTRAINT,不同值分类为带 constraintId 的 CONSTRAINT_CONFLICT。迭代结束时对每个残差超限的 driving 约束保留逐约束冲突信息,同时继续输出兼容的 SOLVER_NOT_CONVERGED 总诊断;未知几何、非法值和不支持约束仍保持 invalid

Node Facade 回归、2000 模型/4000 solve fuzz 和 500 模型/1000 solve stress 均通过stress 最大残差 4.577566798522237e-16、确定性摘要更新为 edac8aed。新增 Chrome 150 chrome-sketcher-diagnostics-harness.html 回放 FreeCAD 对照最小 fixturereference 返回 under-constrained、3 DOF 且端点保持不变;同值 dimension 返回 under-constrained + REDUNDANT_CONSTRAINT;不同值 dimension 返回 conflicting + CONSTRAINT_CONFLICT + SOLVER_NOT_CONVERGED。Chrome 页面创建、读取并删除 OPFS markercheck:chrome-sketcher-diagnostics 已纳入全量 verify

该增量只完善 Basic solver 的尺寸/参考分类和最小对照 fixture完整 planegcs dimensional rank、单位/表达式驱动尺寸、冗余最小冲突集、FreeCAD 全量成功/失败 fixture 和几何/约束图仍未完成。SK-07、SK-06、SK-12 继续保持 in_progress,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

127. 2026-08-05 SK-11 Chrome profile 校验增量

新增 chrome-profile-validation-harness.html 与对应 Chrome runner/checker直接回放 Facade 的 classifyPlanarProfile/validatePlanarProfile 合同。Chrome 150 对闭合单环、开放环、多环孔、边自交、孔嵌套非法、非平面和退化共 7 类 profile 取得稳定分类:closedopenmulti-ringself-intersectinginvalid-nestingnon-planardegenerate;有效闭合/多环输入无异常,其他五类返回对应的 openself-intersectingcontained directlycoplanarcollinear 错误文本。

Chrome 页面创建、读取并删除 OPFS markersuite=SK-11cases=7),报告 crossOriginIsolated=truecheck:chrome-profile-validation 已纳入全量 verify。该证据只覆盖当前 Facade profile 分类/校验和最小错误矩阵FreeCAD 全量 Sketcher profile fixture、复杂曲线环、Support/Attachment 消费方和 PartDesign 全模式仍未完成SK-11、SK-06、SK-07、SK-12 继续保持 in_progress,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

128. 2026-08-05 SK-09 Chrome 交互编辑器增量

新增 Chrome 150 chrome-sketcher-editor-harness.html,通过 Facade 回放事务化 drag、trim、extend、split、自动约束和 undo/redo 事件。带 Horizontal 约束的 drag 将端点从 (5,1) 拖至 (8,2) 后重求解为 (8,0)源快照保持不变split 在 x=4 保留稳定源 ID 并生成 line-2extend/trim 分别得到 x=15/x=7 且不修改源;自动约束建议顺序稳定为 coincident,horizontal 并可一次性应用;事件回放报告 applied=2undone=1redone=1、最终端点 x=6

Chrome 页面创建、读取并删除 OPFS markersuite=SK-09operations=6check:chrome-sketcher-editor 已纳入全量 verify。该切片覆盖 Facade 事务和确定性回放,不宣称已经完成真实鼠标坐标/键盘焦点、任务面板交互、弧/圆/样条 trim、约束迁移全矩阵或 FreeCAD GUI 像素级一致SK-09、SK-10、SK-11、SK-06、SK-07、SK-12 继续保持 in_progress,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

129. 2026-08-05 SK-10 Chrome B-spline 编辑增量

新增 Chrome 150 chrome-sketcher-bspline-harness.html,通过 editSketchBspline 对同一稳定 ID 一次性回放 poles、weights、knots、degree、periodic3 个 poles 的中点更新为 (2,3)degree 2→1weights 为 [1,0.5,1]knots 为 [0,0,0.5,1,1]periodic 为 true;原始 Sketch 签名保持不变。无效 weight、knots、degree 均在事务提交前返回明确校验错误,失败不会污染源快照。

Chrome 页面创建、读取并删除 OPFS markersuite=SK-10fields=5check:chrome-sketcher-bspline 已纳入全量 verify。该切片证明领域模型的 B-spline 编辑和原子校验,不宣称 planegcs 已支持 B-spline 求解、真实 GUI 控点拖拽、周期曲线重参数化或 FreeCAD 全量 B-spline 约束 fixtureSK-10、SK-09、SK-11、SK-06、SK-07、SK-12 继续保持 in_progress,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

130. 2026-08-05 SK-12 Chrome Sketcher 黄金/压力增量

新增 Chrome 150 chrome-sketcher-stress-harness.html,使用与 Node stress 相同的 seed 539363331 回放 500 个模型、1000 次 solve五类 fixture 各 100 个Chrome 报告 digest edac8aed、最大迭代 64、最大残差 4.577566798522237e-16、确定性不匹配 0、意外结果 0,运行耗时 14.295ms,未超过 2000ms 预算。状态分布为 under-constrained 400、conflicting 100、invalid 0类别覆盖 constraints/conflict/redundant/reference/drag。

Chrome 页面创建、读取并删除 OPFS markersuite=SK-12models=500solves=1000check:chrome-sketcher-stress 已纳入全量 verify。该证据完成当前 Basic solver 的 Chrome 压力/确定性切片,不宣称 planegcs 全约束、B-spline 求解、FreeCAD 全量模型和真实 GUI 长会话已完成SK-12 及 P04 其他任务仍保持 in_progress,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

131. 2026-08-05 PART-ALL Chrome 原语增量

新增 Chrome 150 chrome-part-primitives-harness.html,通过 Bitbybit Geometry Worker 回放 Ellipsoid、Torus、Prism、Wedge、Helix 五种 Part 原语。前四项均返回非空三角网格和正体积(体积分别为 100.4869980430383798.6960440108935241.569219381653056120Helix 作为 wire 以 linearLength=25.839014719433763 验证。五个 ShapeHandle 在释放前为 5/5,释放后 shapeCount/kernelReferenceCount=0/0

Chrome 页面创建、读取并删除 OPFS markersuite=PART-ALLoperations=5check:chrome-part-primitives 已纳入全量 verify。该切片补齐当前 Part 原语的 Chrome/资源门禁不宣称完整参数边界、截断角度、局部坐标、FreeCAD 全量 primitive fixture 或 PartDesign 所有特征模式已完成PART-ALL、PD-BASE、PD-LOFT、PD-DRESSUP、PD-TRANSFORM、PD-CLOSURE 继续保持原计划状态,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

132. 2026-08-05 FC-06 Chrome FCStd 语义 round-trip 增量

新增 Chrome 150 chrome-fcstd-semantic-harness.html,由 Facade 写入并读取 1761-byte FCStd metadata archive覆盖 SourceSpreadsheetCutSketch 四对象ExpressionEngine 恢复 Spreadsheet.Width * 2Part Link 恢复 Cut.Base=SourceSketch Support 的稳定 TopoRef 恢复为 Source.Face1Sketch 几何 ID profile 保持不变。归档同时包含 Front/Top GuiDocument 视图和 20-byte BRep Part/Source.Shape.brpElementMap 1 与 1 条映射条目均可检查;报告确认 expression/link/topo-ref 三类依赖语义和 OPFS 归档读取。

Chrome 页面创建、读取并删除 OPFS binary markersuite=FC-06archiveBytes=1761check:chrome-fcstd-semantic 已纳入全量 verify。该切片覆盖 metadata、GuiDocument、BRep/ElementMap 和语义层的最小双向闭环,不宣称所有 LinkSubList、复杂 ExpressionEngine、格式导入导出和 FreeCAD 全量 FCStd fixture 已完成FC-06、FC-04、FC-05、FC-08、FC-11 继续保持原计划状态,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

133. 2026-08-05 PD-TRANSFORM Chrome 文档生命周期增量

新增 Chrome 150 chrome-partdesign-transform-harness.html,通过 Facade 任务边界连续创建 PartDesign::MirroredPartDesign::LinearPatternPartDesign::PolarPatternPartDesign::MultiTransformPartDesign::Hole。每一步都验证预览任务提交、Base 链接、Body.Tip 重定向、参数写入、异步重算和 ShapeHandle 保留;最终 Body.Tip 为 hole5 个特征均为 completed

Chrome 页面把 12 个对象保存到 SQLite OPFS 后加载并再次重算,版本 29、对象数 12、持久化模式 sqlite-opfs;同时创建、读取并删除 OPFS markersuite=PD-TRANSFORMoperations=5。5 个 ShapeHandle 在释放前为 6/6dispose()shapeCount/kernelReferenceCount=0/0check:chrome-partdesign-transform 已纳入全量 verify

该切片补齐文档级 whole-shape 变换和基础 Hole 的 Chrome/OPFS 生命周期证据,不宣称 FreeCAD 局部特征列表、Datum/TopoRef 轴面、单实体过滤、孔标准/螺纹完整语义或原生 OCCT 特征历史已完成PART-ALL、PD-BASE、PD-LOFT、PD-DRESSUP、PD-TRANSFORM、PD-CLOSURE 继续保持原计划状态,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

134. 2026-08-05 PD-LOFT Chrome 失败恢复与 OPFS 增量

新增 Chrome 150 chrome-partdesign-loft-harness.html,通过 Facade 创建带 AttachmentOffset.z=6 的第二截面并提交 PartDesign::AdditiveLoft;重算成功,Profile=sketchSections=[sketch001]、Body.Tip 为 additive-loft。随后注入重复截面Chrome 返回 LOFT_SECTIONS_DUPLICATE,失败期间保留最近有效 ShapeShape ID 不变),恢复链接后再次重算为 completed

同一回放继续提交 PartDesign::AdditivePipe 的 Profile/Spine/Base 链。当前 Bitbybit 1.1.1 管线对该文档截面/路径组合返回明确 GEOMETRY_EXECUTION_FAILED,未产生 ShapeHandle且 OPFS 保存/加载保留失败对象和版本 42该失败被作为显式能力差异记录而非静默成功。Chrome 页面创建、读取并删除 OPFS markersuite=PD-LOFToperations=2),失败后释放资源为 0/0check:chrome-partdesign-loft 已纳入全量 verify

该证据补齐 Additive Loft 的截面、失败恢复、重算和 OPFS 生命周期,并把当前 Additive Pipe 几何缺口固定为可诊断结果;不宣称 Pipe 的 Transition/Frenet/Auxiliary/多截面、Subtractive Loft/Pipe、FreeCAD 原生历史或完整特征模式已完成。PD-BASE、PD-LOFT、PD-DRESSUP、PD-TRANSFORM、PD-CLOSURE 继续保持原计划状态,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

135. 2026-08-05 SS-ALL Spreadsheet 核心合同与 Chrome OPFS 增量

新增 facade/spreadsheet.ts,提供规范 A1 地址、单位 Quantity、公式、Alias、对象属性绑定元数据、依赖边、循环诊断、样式、合并区域、命名范围、行列插入地址迁移和确定性 CSV 导出。Node 回归覆盖 Width=6 mmLength=Width*2、单元格引用、重复 Alias 拒绝、B1/C1 循环、绝对地址规范化、绑定、样式/合并/命名范围迁移和非法地址Spreadsheet 公式继续复用统一 Facade Quantity 表达式语义,不引入绕过 Bitbybit Facade 的页面入口。

新增 Chrome 150 chrome-spreadsheet-harness.htmlWidth 从 6 mm 更新到 8 mm 后 Length 从 12 mm 重算为 16 mm并绑定到 pad.LengthUndo/Redo 分别恢复 12/16。Facade 表达式桥接 Spreadsheet.Length + 1 mm 得到 13 mm循环 C1↔D1 显式诊断CSV 为 2 行 4 列;同一回放验证 4 个样式单元格、命名范围 A1:A3、合并范围 A1:C3 和插入后公式地址 A3。绑定后的文档以 sqlite-opfs 保存/重开,版本 20、属性值 16939-byte Spreadsheet snapshot 通过 OPFS 内容寻址资源写入、读取和释放,直接 OPFS markercells=9也完成创建、读回和删除ShapeHandle/kernel reference 最终为 0/0check:chrome-spreadsheettest:spreadsheet 已纳入全量 verify

该切片推进 SS-ALL 的 Cell/Formula/Alias/Binding/Style/Merge/NamedRange/RowColumn/CSV 和循环诊断,不宣称 XLSX、真实表格 UI、大表性能或完整 FreeCAD Spreadsheet oracle 已完成SS-ALL 与 DOC-CLOSURE 保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

136. 2026-08-05 PLOT-ALL 数据绑定与 Chrome OPFS 导出增量

新增 facade/plot.ts,提供多 Series、线型样式、线性 Axis、Legend、Spreadsheet/结果源 Binding、绑定数据更新以及确定性 SVG/CSV 导出。领域边界拒绝空/非有限序列、非法色值/线宽/虚线、倒置轴范围、未绑定更新和超限 SVG 尺寸Node 回归覆盖绑定后的三点更新和导出。

新增 Chrome 150 chrome-plot-harness.html:从 Spreadsheet A1:A3/B1:B3 读取 0/1/2 与 6/12/16 mm绑定 length 序列,并与虚线 target 序列共同导出 640×360 SVG 和 CSV。重复 SVG 导出字节完全一致SVG 为 1031 bytes、2 条 path、包含 role=img/aria-labelSHA-256 为 2183f0d048c9689f8865f11e2964e994c44cb1f7c03e382d7c1b99c805eba2a2CSV 为 156 bytes、7 行SHA-256 为 5879d47bdda947b5432ef38a03a6e8299cdb4e90cfea0370e398833a9c01244a。两份导出均通过 SQLite/OPFS 内容寻址资源写入、读回和释放,直接 OPFS marker 也完成创建、读取和删除,最终 ShapeHandle/kernel reference 为 0/0check:chrome-plottest:plot 已纳入全量 verify,兼容矩阵将 Spreadsheet/Plot 标为 domain-contract/experimental,不再错误登记为纯 scope-only。

该切片推进 PLOT-ALL 的 Series/Axis/Legend/Style/Binding/SVG/CSV不宣称 PNG 等位图导出、结果工作台适配、实时 UI、FreeCAD Plot Python 行为 oracle 或大数据性能已完成PLOT-ALL 和 DOC-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

137. 2026-08-05 DRAFT-BASE/DRAFT-OPS 参数对象与 Chrome OPFS 增量

新增 facade/draft.ts,提供正交归一工作平面、网格间距与捕捉、二维 Line/Wire/Circle 参数对象、Layer以及 Move/Rotate/Scale、Line Offset、Clone、二维 Array 和 Layer 重绑定。Clone/Array 只保存 sourceId、平移、旋转、比例和 layer不烘焙独立几何工作平面映射返回稳定 3D 坐标,所有非法平面、退化线、非法半径、数组上限和不支持 Offset 类型均显式拒绝。

Chrome 150 chrome-draft-harness.html 回放工作平面 origin=(10,20,30)、正交轴、0.5 网格((1.24,2.26)→(1,2.5)),世界坐标 (2,3)→(10,22,33);创建 9 个对象2 Line、1 Wire、1 Circle、1 Offset、1 Clone、4 Array完成 Move/Rotate/ScaleOffset 长度 85 个对象保留 sourceId=line2 个 Layer 持久存在。1567-byte Draft snapshot 通过 SQLite/OPFS 内容寻址资源写入、读回和释放,直接 OPFS marker 创建、读取和删除ShapeHandle/kernel reference 最终为 0/0check:chrome-drafttest:draft 已纳入全量 verify,兼容矩阵将 Draft 标为 domain-contract/experimental

该切片推进 DRAFT-BASE/DRAFT-OPS 的参数对象和资源边界,不宣称 Draft 全部曲线/墙体/文本、复杂 Offset/Trim、真实 GUI 工作平面交互、FreeCAD Python oracle、Bitbybit Shape 生成或完整 .FCStd 工作台闭环已完成DRAFT-BASE、DRAFT-OPS、DOC-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

138. 2026-08-05 TD-ALL TechDraw 页面/投影/标注与 Chrome OPFS 增量

新增 facade/techDraw.ts,提供 Page 尺寸、稳定 TopoRef 点/边源、正投影 View、Section View、Dimension、Annotation 和确定性 SVG 页面导出。源 revision 必须递增;更新时按 persistent ID 重新投影和重算尺寸,旧点删除会进入 unresolved,不会静默绑定到新的索引;法向、缩放、尺寸、源点/边和重复 ID 均有边界拒绝。

Chrome 150 chrome-techdraw-harness.html 回放 Front 与 Section 两个 View、1 个 Dimension、1 个 Callout Annotation源长度从 4 更新到 6 后 Dimension 为 6删除 Vertex3 后两 View 汇总 unresolvedRefs=[Vertex3]。页面 SVG 为 549 bytes、2 条可见边、带 role=img/aria-labelSHA-256 为 ef240c4ee443e4386a80b001621c75424c9a8d75707f5cb3a5c3a65298274c97重复导出字节一致SVG 与 1644-byte TechDraw snapshot 均通过 SQLite/OPFS 内容寻址资源写读释放,直接 OPFS marker 创建、读取和删除ShapeHandle/kernel reference 为 0/0check:chrome-techdrawtest:techdraw 已纳入全量 verify,兼容矩阵将 TechDraw 标为 domain-contract/experimental

该切片推进 TD-ALL 的 Page/View/Section/Dimension/Annotation/TopoRef 更新和 SVG 资源边界不宣称复杂投影算法、剖切实体几何、GD&T、模板、PDF、真实 GUI 页面编辑或 FreeCAD TechDraw oracle 已完成TD-ALL 与 DOC-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

139. 2026-08-05 ASM-CORE 组件/连接器/约束求解增量

新增 facade/assembly.ts提供参数化组件sourceObjectId、Placement、Grounded、连接器局部原点/轴、Fixed/Coincident/Concentric/Distance/Angle 约束、确定性有限迭代平移求解、Ground 冲突与缺失连接器诊断。距离约束在重合后使用连接器轴作为零距离方向,快照返回深拷贝,非法轴、角度和同组件约束在提交前拒绝;该合同不伪造完整刚体 6-DOF 求解器。

新增 Chrome 150 chrome-assembly-harness.html:通过 Bitbybit Geometry Worker 创建 Base/Shaft 两个 BoxAssembly 将 Base 固定、Shaft 先重合再保持 5 mm 距离2 个 Joint 均为 solved,迭代数 2Shaft X 为 5,诊断数为 0。848-byte Assembly snapshot 通过 SQLite/OPFS 内容寻址资源写入、读回和释放,直接 OPFS markersuite=ASM-COREcomponents=2)创建/读回/删除,最终 ShapeHandle/kernel reference 为 0/0check:chrome-assemblytest:assembly 已纳入全量 verify

该切片推进 ASM-CORE 的组件、连接器、基础约束和资源边界,不宣称 Assembly 的完整旋转/运动求解、碰撞与干涉、BOM/Exploded View、变体、大装配性能、FreeCAD Assembly oracle 或 FCStd 工作台闭环已完成;ASM-COREASM-TOOLSENG-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

140. 2026-08-05 MESH-CORE 网格规范化/质量与 OBJ 增量

新增 facade/mesh.ts,提供来自 Bitbybit MeshAsset 的规范顶点/三角形快照、坐标焊接、退化三角形清理、边界/非流形/面积/包围盒质量分析、平移缩放和确定性 OBJ 导出,并提供最小三点孔洞三角修补合同;非法索引、非有限点、错误容差和重复修补边均显式拒绝。

新增 Chrome 150 chrome-mesh-harness.html:通过 Bitbybit Geometry Worker 创建 10×8×4 Box 并生成网格,焊接 24 个重复面顶点为 8 个共享顶点,得到 12 个三角形、0 边界边、0 退化三角形、面积 304;平移/缩放后包围盒最小点为 [-6.5,-1,-3]OBJ 为 340 bytes、SHA-256 5e92b07b682e0a4a0133b556494a2c11cacf97ed901579efde985dd270a1213a。259-byte Mesh snapshot 通过 SQLite/OPFS 内容寻址资源往返和释放,直接 OPFS markersuite=MESH-COREtriangles=12)创建/读回/删除,最终 ShapeHandle/kernel reference 为 0/0check:chrome-meshtest:mesh 已纳入全量 verify

该切片推进 MESH-CORE 的三角网格规范化和基础修复,不宣称完整 Mesh/MeshPart 算法(高级 hole filling、remesh、decimation、self-intersection repair、曲率/法向工具、PLY/STL 全量 round-trip、实时 GUI 或 FreeCAD Mesh oracle 已完成;MESH-COREENG-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

141. 2026-08-05 INSP-ALL 几何质量/测量/依赖报告增量

新增 facade/inspection.ts,提供结构有效 Shape 注册、Bitbybit 质量报告投影、点距、向量夹角、面积/体积测量、缺失依赖检查和确定性 CSV 报告。非法/退化向量返回 invalid 测量,非有限或负质量、非法边界和结构无效 Shape 在注册时拒绝;快照和依赖列表均隔离复制。

新增 Chrome 150 chrome-inspection-harness.html:通过 Bitbybit Geometry Worker 创建 4×5×6 Box质量报告为 1 solid点距为 5 mm,夹角为 90 deg,体积/面积直接来自 Bitbybit MassPropertiesCSV 为 4 条测量记录。Inspection snapshot 通过 SQLite/OPFS 内容寻址资源读写释放,直接 OPFS markersuite=INSP-ALLmeasurements=4)创建/读回/删除,最终 ShapeHandle/kernel reference 为 0/0check:chrome-inspectiontest:inspection 已纳入全量 verify

该切片推进 INSP-ALL 的测量、质量和依赖诊断基础,不宣称完整剖面/截面比较、GD&T、容差带、点云偏差、批量报告模板、实时 GUI 或 FreeCAD Inspection oracle 已完成;INSP-ALLPLATFORM-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

142. 2026-08-05 BIM-CORE/BIM-IFC 层级材料与最小 IFC 增量

新增 facade/bim.ts,提供 Level、Space、Material、Wall/Structure/Window 等 Element 的层级引用、属性和数量、材料绑定、数量表及确定性 IFC STEP 文本导出。元素必须引用有效 Level、可选 Space/Material 和 Bitbybit shapeId负数量、重复对象和失效层级链接在提交前拒绝IFC 导出明确为最小 IfcBuildingStorey/IfcSpace/IfcBuildingElementProxy 合同,不伪造完整 IFC 几何实体。

新增 Chrome 150 chrome-bim-harness.html:通过 Bitbybit Geometry Worker 创建 Box 作为 Wall 的 Shape建立 Ground Level、Plant room、Concrete 材料和 1 个 Wall数量表 1 行IFC 文本包含 3 类实体。模型 snapshot 通过 SQLite/OPFS 内容寻址资源往返和释放,直接 OPFS markersuite=BIM-COREelements=1)创建/读回/删除,最终 ShapeHandle/kernel reference 为 0/0check:chrome-bimtest:bim 已纳入全量 verify

该切片推进 BIM-CORE/BIM-IFC 的对象层级、材料、数量和最小导出边界,不宣称 IFC2x3/IFC4 完整 schema、真实 IfcProduct 几何、分类/PropertySet 全覆盖、门窗族、碰撞/空间分析、实时 GUI 或 FreeCAD BIM oracle 已完成;BIM-COREBIM-IFCENG-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

143. 2026-08-05 CAM-ALL Job/Stock/Tool/Path/Simulation 增量

新增 facade/cam.ts,提供 CAM Job 的 Stock 边界、Tool、Profile/Pocket/Contour Operation、矩形路径生成、路径越界碰撞诊断和确定性 G-code 导出。刀具/进给/深度、重复对象和 Stock 范围均有边界校验;没有生成路径或路径越界时 Simulation 返回 collisionG-code 不会静默导出。

新增 Chrome 150 chrome-cam-harness.html:通过 Bitbybit Geometry Worker 创建 5×2×3 Box 作为 Job 目标,建立 1 把刀具和 1 个 Profile Operation生成 5 点闭合矩形路径Simulation 为 pass、碰撞数 0G-code 非空。CAM snapshot 通过 SQLite/OPFS 内容寻址资源往返和释放,直接 OPFS markersuite=CAM-ALLoperations=1)创建/读回/删除,最终 ShapeHandle/kernel reference 为 0/0check:chrome-camtest:cam 已纳入全量 verify

该切片推进 CAM-ALL 的 Job/Stock/Tool/Operation/Simulation/G-code 基础边界不宣称完整刀路算法、3/5 轴运动学、真实材料去除仿真、碰撞几何、后处理器、刀具库、FreeCAD Path oracle 或生产 CAM 安全门禁已完成;CAM-ALLPLATFORM-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

144. 2026-08-05 FEM-ALL 材料/网格/载荷/参考求解增量

新增 facade/fem.ts,提供 MaterialYoung modulus/Poisson ratio、Node 网格、固定节点、节点载荷、确定性一维杆参考求解、位移/应力结果和 CSV 导出。材料、节点、载荷和求解输入有边界校验;未准备完整分析时返回 invalid,不伪造通用有限元刚度矩阵或外部 solver。

新增 Chrome 150 chrome-fem-harness.html:通过 Bitbybit Geometry Worker 创建 10×2×2 Box 作为分析来源2 节点钢材参考杆在 100 N 载荷下得到最大位移 0.00125、最大应力 25,结果 CSV 非空。FEM snapshot 通过 SQLite/OPFS 内容寻址资源往返和释放,直接 OPFS markersuite=FEM-ALLnodes=2)创建/读回/删除,最终 ShapeHandle/kernel reference 为 0/0check:chrome-femtest:fem 已纳入全量 verify

该切片推进 FEM-ALL 的材料、网格、载荷、参考求解和结果边界,不宣称完整 3D FEM 单元、网格生成/质量、接触/非线性/热分析、真实 solver Worker、VTK 结果、FreeCAD FEM oracle 或工程安全验证已完成;FEM-ALLPLATFORM-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

145. 2026-08-05 ROBOT-ALL 关节限位/Waypoint/轨迹增量

新增 facade/robot.ts,提供关节最小/最大限位、Waypoint 校验、分段线性轨迹生成、轨迹越界诊断和 CSV 导出。Waypoint 必须覆盖完整关节集合且不能越限;轨迹生成要求至少两个点,步数上限固定,越限轨迹不会标记为 generated

新增 Chrome 150 chrome-robot-harness.html:通过 Bitbybit Geometry Worker 创建 Box 作为工件引用,建立 3 个关节、Home/Pick 两个 Waypoint生成 5 个姿态且 0 个限位违反CSV 非空。Robot snapshot 通过 SQLite/OPFS 内容寻址资源往返和释放,直接 OPFS markersuite=ROBOT-ALLposes=5)创建/读回/删除,最终 ShapeHandle/kernel reference 为 0/0check:chrome-robottest:robot 已纳入全量 verify

该切片推进 ROBOT-ALL 的关节/轨迹/导出基础边界,不宣称完整机器人模型、逆/正运动学、碰撞/奇异位形、控制器通讯、真实仿真、后处理或 FreeCAD Robot oracle 已完成;ROBOT-ALLPLATFORM-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

146. 2026-08-05 DATA-ALL 专业数据模块适配器清单增量

新增 facade/dataModules.ts,为 Points、ReverseEngineering、OpenSCAD、IDF、JtReader、Material、Import 建立显式 adapter descriptor、允许格式、操作清单、supported/proxy 能力级别、8 MiB 输入边界、记录删除和确定性 manifest。当前 Material/Import 标记为领域合同,其他五项明确为 read-only proxy未知格式、空输入、超限输入和重复记录均拒绝不把登记清单伪装成真实几何适配器。

新增 Chrome 150 chrome-data-harness.html:七类模块各回放一个最小记录,得到 2 个 supported、5 个 proxy 和 7 条 manifest 记录。Data snapshot 通过 SQLite/OPFS 内容寻址资源往返和释放,直接 OPFS markersuite=DATA-ALLrecords=7)创建/读回/删除,最终 ShapeHandle/kernel reference 为 0/0check:chrome-datatest:data 已纳入全量 verify

该切片推进 DATA-ALL 的模块登记、格式边界和 proxy 可诊断性,不宣称 Points 点云处理、Reverse Engineering 拟合、OpenSCAD 执行、IDF/JT 语义解析、完整 Material 卡或批量 Import 已完成;DATA-ALLADDON-ALLSCRIPT-ALLPLATFORM-CLOSURE 继续保持 pending,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

147. 2026-08-05 TSN-03 Chrome 原生 PartDesign Fillet history

原生 OCCT history 增加 fillet 单输入协议字段 radius、Worker 请求映射和 BRepFilletAPI_MakeFillet 实现;构建清单启用 TKFilletTKBool 依赖。Node smoke 通过 STEP round-tripBox 全边圆角返回 150 条关系6 modified、72 generated、72 deleted结果为有效 1 solid。Chrome 150 真实回放由 Bitbybit Geometry Worker 创建 Box 并执行 Fillet再将 Base STEP 交给独立 native history WorkerFacade 映射只保留稳定源对象/子形状关系OPFS marker 创建、读取、删除通过runtime ShapeHandle/kernel reference 最终为 0/0,结果体积 215.79398223686158

test:chrome-native-fillet-historycheck:chrome-native-fillet-history 已纳入全量 verifyChrome 报告记录 provider occt-native.history-step、OCCT 8.0.0step-text transport。该切片只覆盖全边固定半径 Fillet history选边半径、可变半径、Chamfer/Draft/Thickness、Support/AttachmentOffset、稳定 TopoRef 迁移和 Body/Tip 自动重算仍未完成TSN-03、PD-DRESSUP、PD-CLOSURE 继续保持进行中,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

148. 2026-08-05 TSN-03 Chrome 原生 PartDesign Chamfer history

在已构建的 TKFillet/TKBool 链上增加 BRepFilletAPI_MakeChamfer,协议新增单输入 chamfer 与有限正数 distanceDirect provider、Dedicated Worker、STEP bridge 和 Bitbybit GeometryRuntime 均显式声明并路由该操作。共享 dress-up collector 逐源子形状读取 Modified/Generated/IsDeletedNode smoke 的 6×6×6 Box 全边 0.4 Chamfer 得到 150 条关系6 modified、72 generated、72 deleted、有效 1 solid 和体积 210.5813333333333

Chrome 150 真实回放通过 Bitbybit Geometry Worker 执行单边 Chamfer并经原生 Worker 回放 Base STEP 的全边 Chamfer historyChrome 结果为有效 1 solid、体积 215.52000000000004OPFS marker 创建/读取/删除通过ShapeHandle/kernel reference 最终 0/0check:chrome-native-chamfer-history 已纳入全量 verify。该切片不宣称选边 transport、双距离/距离角度 Chamfer、Draft/Thickness、TopoRef 自动迁移或完整 PartDesign 重算闭环已完成,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

149. 2026-08-05 TSN-03 Chrome 原生 PartDesign Hole history

原生 history Worker 增加 hole 单输入协议,显式传递 radiusdepthpositiondirectionOCCT 通过 BRepPrimAPI_MakeCylinder 创建定向圆柱刀具,再以 BRepAlgoAPI_Cut 生成真实孔切削及逐源 Modified/Generated/Deleted 关系。Node smoke 通过 STEP round-trip10×10×10 Box 的半径 1、深度 10 直孔返回有效 1 solid、8 条关系6 modified、0 generated、2 deleted原生结果体积 996.0730091830127

Chrome 150 真实回放由 Bitbybit Geometry Worker 创建工件和圆柱 Profile运行时 Cut 结果与原生 Worker 的 Hole history 分离验证;报告为有效 1 solid、体积 968.5840734641026 modified/2 deletedOPFS marker 创建/读取/删除通过ShapeHandle/kernel reference 最终 0/0test:chrome-native-hole-historycheck:chrome-native-hole-history 已纳入全量 verifyartifact hash 同步到兼容矩阵和 OCCT drift baseline。该切片只覆盖显式位置/方向的圆柱直孔,不宣称 Threaded、Counterbore、Countersink、Through-all、面 Support、AttachmentOffset、选边 transport 或完整 PartDesign Hole historyTSN-03、PD-TRANSFORM、PD-CLOSURE 继续保持进行中,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

150. 2026-08-06 TSN-03 原生历史接入重算与应用 Worker

重算引擎现在把全边 Part/PartDesign Fillet、全边 Chamfer 和基础圆柱直孔的 native history 结果送入稳定 TopoRef 快照;选边 dress-up、复杂孔参数和没有严格几何对应的特征继续使用签名历史避免把全边 OCCT 关系错误套用到局部结果。基础有限深度 Hole 在生产 Bitbybit runtime 中改用真实圆柱刀具 + Cut测试桩没有 native history 接口时保留原有 Pocket 路径。

应用入口默认创建 NativeOcctHistoryWorkerProvider,将原生 Worker 的初始化、失败提示和释放纳入 Facade 生命周期Chrome app E2E、生产构建和 Facade 159 项回归通过。该接线只宣称已验证的 native history 子集,未把默认 Worker 可用性当作 TSN-03 完成,计划仍为 30 completed、21 in_progress、32 pending、0 blocked。

151. 2026-08-06 QA-06 native OCCT Worker 故障注入扩展

在既有 Chrome QA-06 harness 中增加真实 NativeOcctHistoryWorkerProvider 包装器:初始化原生 OCCT JS/WASM 后注入 Worker 终止,确认 provider 进入 unavailable、自动创建替代 Worker 并重新初始化为 available。Chrome 报告记录 native Worker factory 2 个实例、nativeCrashInjected=truenativeRecoveredAvailable=true;原有 planegcs Worker 取消、崩溃恢复和 stale 结果继续保持通过。

故障注入 server 补充同源 /native/occt-history/ JS/WASM 路由OPFS 0 字节标记仍完成创建、读取、删除planegcs/native Worker 在 dispose 后分别回收 3/32/2。该证据关闭 QA-06 的 native history Worker 崩溃恢复子项电源断电、SQLite VFS 写入中断和跨版本数据降级仍未宣称完成,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

152. 2026-08-06 REL-02/QA-06 OPFS 迁移提交前中断彩排

SQLite/OPFS persistence Worker 增加仅供迁移彩排使用的 migrationInterruptAfterVersion 注入点:目标版本的 DDL 与 schema_migrations 标记已经执行、但事务尚未提交时抛出错误。Chrome 150 从真实 schema v1 OPFS 数据库迁移时在 v3 注入中断,初始化按预期拒绝;独立 inspector 随后只读到原有版本 [1],证明 v3 的结构和迁移标记没有部分提交。

同一 Chrome 回放在移除注入后完成 v1→v6保留 1 个文档对象、资源内容和 checkpoint迁移后与重开后的 integrity check 均为 ok,文档版本从 3 更新到 4内容寻址资源完成读回和释放隔离的 SQLite 文件最终从 OPFS 删除。test:chrome-opfs-migrationcheck:chrome-opfs-migration 覆盖上述证据。

该切片验证确定性的事务提交前中断,不等同于操作系统断电、浏览器进程在 SQLite VFS journal I/O 中被硬杀或旧版本程序执行降级;这些真实破坏与回滚彩排仍属于 REL-02/QA-06 剩余工作。计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

153. 2026-08-06 TSN-03 原生 PartDesign Draft history

原生 history WASM 增加 TKOffsetBRepOffsetAPI_DraftAngle,协议显式传递单个 face index、角度、拔模方向、中性面原点/法向和 ReversedDirect provider、Dedicated Worker 与显式 Bitbybit runtime bridge 均只接受一个 face index。Node STEP smoke 的 10×10×10 Box 返回 5 条原生关系并保持有效单实体Facade 新增请求映射回归,总计 160/160 通过。

Chrome 150 由 Bitbybit Geometry Worker 创建并执行单面 Draft经 STEP 交给独立 native history Worker 回放:返回 5 条关系4 modified、1 generated、0 deleted、有效 1 solid、体积 63.999999999999986OPFS marker 创建/读取/删除通过Bitbybit ShapeHandle/kernel reference 最终为 0/0。原生 JS/WASM SHA-256 更新为 24a169bf8ba9514c7efec2c3fca078c6ec51ab94b23dd87307a9298fa6d039b4953e5af0e2849f0cf6a11515d00e1c348ae4af68b378e95c5bba9cfeee21ea4b

复核确认早期跨 WASM 失败来自角度单位错误:BRepOffsetAPI_DraftAngle 接收弧度,协议接收 FreeCAD/Bitbybit 的角度。修正 degree→radian 后Chrome 已由 Bitbybit 创建并执行 5° Draft、导出 STEP再由原生 Worker 成功回放Bitbybit 结果体积为 63.999999999999986。一个已解析稳定 face TopoRef 的 PartDesign Draft 现在接入自动 native history多面/切面传播继续回退签名历史。多面完整映射、完整 FreeCAD Draft oracle和 Thickness 仍是 TSN-03/PD-DRESSUP 剩余工作。计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

154. 2026-08-06 TSN-03 原生 PartDesign Thickness history

原生 history WASM 增加 BRepOffsetAPI_MakeThickSolid 单移除面合同,协议传递 face index、有限非零 offset 与 Arc/Intersection joinDirect provider、Dedicated Worker、Bitbybit runtime bridge 和单稳定 RemoveFaces TopoRef 自动重算均已接线。Node smoke 的 6×6×6 Box、-0.4 Arc Thickness 返回有效 1 solid、38 条关系和体积 64.57600000000008

Chrome 150 由 Bitbybit 创建并执行同一 Thickness再以 STEP 交给原生 Worker原生返回 38 条关系1 modified、37 generated、0 deleted、有效 1 solid原生与 Bitbybit 体积均为 64.57600000000002OPFS marker 完成创建/读取/删除ShapeHandle/kernel reference 最终 0/0。Bitbybit 自身质量报告仍为 structuralValid=false,该差异被显式保留,未伪装成完全有效。原生 JS/WASM SHA-256 为 d820099a48b49b9c0265b7c796eb56475048aac9c12ea74a0598ad9cf7dae0b100f08a4f6db36801b4e3ef023bf664eac4f122c4b055cd9e90c747e5d956ddf0

该切片不宣称多移除面、正 offset、Intersection 全矩阵、自交修复、完整 FreeCAD Thickness oracle 或 Bitbybit 结构质量差异已闭环;TSN-03/PD-DRESSUP 继续保持进行中,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

155. 2026-08-06 TSN-03 原生 LinearPattern history

原生 history Worker 增加两实例 Whole shape LinearPattern读取单一 Base STEP以有限非零平移向量生成副本再通过 BRepAlgoAPI_Fuse 返回原件/副本两路 Modified/Generated/Deleted。Facade 自动 history 只在 Occurrences=2、无第二方向、无自定义 spacing list 时启用;更复杂模式继续使用签名 history。

Chrome 150 通过 Bitbybit 创建 2×2×2 Base、平移 1 并 Union原生 Worker 返回 66 条关系64 modified、0 generated、2 deletedBitbybit/原生体积为 12/11.999999999999995,原生结果有效 1 solidOPFS marker 删除且资源最终 0/0。Bitbybit Fuse 质量仍报告 structuralValid=false,差异被保留。新 WASM SHA-256 为 5ba87ae140761b3d8cde90dcd0dbc407ae3bc9ddc94b40880eea7fd6cb62d0dc

该切片不宣称三实例以上、双方向、SpacingPattern、非融合结果、Feature-list 局部变换或 PolarPattern 已完成;TSN-03/PD-TRANSFORM 保持进行中,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

156. 2026-08-06 TSN-03 原生 PolarPattern history

原生 history Worker 增加两实例 Whole shape PolarPattern协议传递轴原点、轴方向和角度OCCT 以 BRepBuilderAPI_Transform 生成旋转副本并 Fuse返回两路原生历史。Facade 自动 history 仅覆盖 Occurrences=2、无自定义 Spacings/SpacingPattern 的单轴子集,其他模式继续使用签名 history。

Chrome 150 对中心 2×1×1 Box 绕 Z 轴 90° 回放:原生 Worker 返回 68 条 modified 关系Bitbybit/原生体积为 3/3.0000000000000004,原生结果有效 1 solidOPFS marker 删除且资源最终 0/0。Bitbybit Fuse 的 structuralValid=false 继续作为显式兼容差异。原生 JS/WASM SHA-256 为 002ffbf60e8a14d6f5f7061cb3373e2ea55c25082c85721f2686497b8ade6ad0ea82356e89ba66a43f3f104a94b9901defaacf92cc704f5f2492e5a3c7678f57

三实例以上、SpacingPattern、任意轴 Support、Feature-list 局部变换和 MultiTransform 原生历史仍未闭环;TSN-03/PD-TRANSFORM 保持进行中,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

157. 2026-08-06 TSN-03 原生 Mirrored history

原生 history Worker 增加单 Base、Whole shape、融合结果的 Mirrored 子集协议显式传递镜像平面原点和法向OCCT 以 gp_Trsf::SetMirror(gp_Ax2) 生成镜像副本并通过 BRepAlgoAPI_Fuse 返回原件/副本两路 Modified/Generated/Deleted。Facade 自动 history 仅在 Originals 为空、Fuse=true、Whole shape 且使用 XY/XZ/YZ 文档基准面时启用;多源、非融合和其他变换模式继续使用签名 history。

Chrome 150 由 Bitbybit 创建横跨 YZ 平面的 2×1×1 Box、执行 mirror 与 Union再经 STEP 交给原生 Worker 回放:返回 66 条关系64 modified、0 generated、2 deletedBitbybit/原生体积为 3/2.999999999999999,原生结果有效 1 solidOPFS marker 完成创建、读取、删除ShapeHandle/kernel reference 最终为 0/0。Bitbybit Fuse 的 structuralValid=false 继续作为显式兼容差异。原生 JS/WASM SHA-256 为 667cd5197a6a2d424c024b7f91e155d01e98e50f0490727b78b3cd3aed90b0335cfaa223915bd1ef1b05387c219799218e326b716d51e9f1f5431fa533cb9f56

Feature-list 局部镜像、任意 Support/AttachmentOffset 平面、非融合结果、多个 Originals 和 MultiTransform 原生历史仍未闭环;TSN-03/PD-TRANSFORM 保持进行中,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

158. 2026-08-06 TSN-03 单步骤 MultiTransform 原生 history

原生 history 协议增加 multi-transform 特征级操作与 transformKind,对恰好一个二实例 linear、polar 或 mirrored Whole shape 步骤复用已经通过 Node/Chrome 验证的 OCCT 绑定。Facade 自动 history 只在单 Base、空 Originals、Whole shape、单步骤且实例数为 2 时启用;有序多步骤、多实例和 Feature-list 图继续回退签名 history避免丢失中间实例到最终子形状的来源关系。

Chrome 150 回放单 linear 步骤Bitbybit 创建 2×2×2 Base、平移 1 并 Union原生 Worker 接收 operation=multi-transformtransformKind=linear 后返回 66 条关系64 modified、0 generated、2 deletedBitbybit/原生体积为 12/11.999999999999995,原生结果有效 1 solid。OPFS marker 记录特征与步骤类型并完成删除ShapeHandle/kernel reference 最终为 0/0Bitbybit Fuse 的 structuralValid=false 仍保留为兼容差异。

两个以上有序步骤、三实例以上、Feature-list 局部变换、任意 Support/AttachmentOffset 轴面和完整 FreeCAD MultiTransform oracle 尚未闭环;TSN-03/PD-TRANSFORM 保持进行中,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

159. 2026-08-06 TSN-03 有序多步骤 MultiTransform 原生 history

原生 OCCT WASM 增加 multiTransformHistoryFromStep(baseStep, steps),接受 26 个二实例 linear、polar 或 mirrored Whole shape 步骤。每一步对当前全部父实例创建新实例,并通过 BRepBuilderAPI_Transform::ModifiedShape 保存从原始 Base 子形状到新实例子形状的映射;最终以多参数 BRepAlgoAPI_Fuse 一次合并全部实例,再将每个参数的 Modified/Generated/IsDeleted 去重聚合回 Base source index。该实现不再只保留最后一次 Boolean 的历史。

Node smoke 与 Chrome 150 都回放 linear 后 mirrored 的两步图1 个 Base 扩展为 4 个实例,最终有效单实体体积为 5。Chrome 原生 Worker 返回 311 条来源关系88 modified、222 generated、1 deletedBitbybit/原生体积为 4.999999999999999/4.999999999999998OPFS marker 记录有序步骤并完成删除ShapeHandle/kernel reference 最终 0/0。原生 JS/WASM SHA-256 更新为 19dba01de37ba5f225f85d5ca5247e2e91cb0241c7b7f372f06862cca5c91ea9bd400e38977c5269dbfddb5dcf484794ba5a814b7dc7ff1547ceaa5fa1e45fe5

当前原生有序图仍限制每步二实例、最多 6 步和 Whole shape三实例以上、Feature-list 局部变换、任意 Support/AttachmentOffset 轴面以及完整 FreeCAD MultiTransform oracle 仍未闭环。TSN-03/PD-TRANSFORM 保持进行中,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

160. 2026-08-06 TSN-03 两截面 Part::Loft 原生 history

原生 OCCT history 增加 BRepOffsetAPI_ThruSections 两截面实体 Loft 合同:两个 Bitbybit STEP profile 分别作为 objecttool 输入,按顶点/边采集真实 Generated 结果,返回可映射到两侧 Sketch TopoRef 的记录。Facade 自动接线只覆盖 Part::Loft、恰好两个截面、Solid、非 Closed、非 Linearize、默认 MaxDegree 的独立放样Additive/Subtractive Loft、三截面以上、闭合、导轨/Frenet/transition 和 Base 融合/切除仍明确回退签名 history。

Node smoke 对两个 2×2 矩形截面Z=0 与 Z=5返回有效单实体、体积 20、24 条 Generated 记录且两侧来源均存在。Chrome 150 以 Bitbybit 导入/放样并导出 STEP经 Dedicated native Worker 回放同一合同24 条 Generated、两侧来源齐全、Bitbybit 单实体体积 20OPFS marker 完成创建、读取、删除ShapeHandle/kernel reference 最终 0/0。Bitbybit loft 质量报告仍为 structuralValid=false,不据此宣称其结构有效。

原生 JS/WASM SHA-256 更新为 d427666c4d25e281b6a969da49eabe421dbc868430b7839944ceeceea2c17c478d80d032d43fd4be0a90552ad893469f504da6d2e8d6868942186687084e944b。该切片推进 TSN-03/PD-LOFT,但不关闭完整 PartDesign Loft/Pipe 历史;机器计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

161. 2026-08-06 PLOT-ALL 对数轴增量

Plot Facade 的轴合同从仅 linear 扩展为 linear | loglog 轴范围必须为正,绑定或更新系列时 X/Y 数据也必须严格为正;已有系列切换到 log 轴会先校验并原子拒绝无效配置。SVG 使用 log10 坐标映射,并写入轴 scale 数据属性CSV/绑定/图例行为保持兼容。

Node Plot 单测 3/3 通过。Chrome 150 + OPFS 回放记录线性 Spreadsheet 绑定与正值 log X/Y 轴SVG 映射确定性和非正数据拒绝均通过SVG/CSV 资源 round-trip、OPFS marker 创建读取删除、ShapeHandle/kernel reference 0/0 均通过。该切片推进 PLOT-ALL,不宣称完整 FreeCAD Plot 样式、刻度、交互和多轴语义已经闭环;计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

162. 2026-08-06 SK-06/SK-07 Chrome 约束诊断增量

在既有 Sketcher 诊断回放中加入 Coincident 与 Block 约束 fixtureChrome 150 中 Coincident 将两条线的指定端点收敛到同一点并保持零残差Block 将完整线几何锁定为 0 自由度且坐标不变原有参考尺寸、冗余和冲突诊断保持通过。OPFS marker 更新为 SK-06/SK-07,创建、读取、删除均通过,回放不持有几何资源。该切片补充 SK-06 的 Chrome 证据,不宣称 planegcs 原生已覆盖完整约束集;计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

163. 2026-08-06 SK-06 原生 planegcs Coincident 子集

锁定 FreeCAD 1.1.1 的真实 GCS::System::addConstraintP2PCoincident,新增 solveCoincidentLines Embind/WASM 函数:固定第一条线,约束 first.end == second.start同时保持第二条线长度。Facade planegcs 子集仅接受两条非退化线、单个 driving Coincident 且端点方向为 first.endsecond.start,不满足时显式回退/拒绝,避免伪装成完整约束图。

Chrome 150 Dedicated Worker 回放原生 Coincident 状态 0、残差 0第二条线起点精确收敛到第一条线终点Provider capabilities 增加 coincident,并继续验证 completed/cancelled/recovered/stale 生命周期。WASM SHA-256 更新为 27a79ec784bcfc3006dd1cd4ecddc860856d6c180f95ae4f7df0517432262687check:planegcs-artifactcheck:chrome-planegcs 和 Facade 165/165 通过。完整 planegcs 约束集、任意端点组合和多几何图仍未完成,计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

164. 2026-08-06 SK-07 原生 distanceX 尺寸子集

原生 planegcs 增加 solveDistanceX:使用 FreeCAD ConstraintDifference、固定首点和 Horizontal 约束求解单线 X 投影尺寸。Facade 仅接受单条非退化线、一个 driving Horizontal 和同线 start -> end 的正值 DistanceXVertical/任意端点组合继续显式拒绝,避免将有限子集冒充完整尺寸图。

Chrome 150 Dedicated Worker 回放 DistanceX 状态 0、X 差值 6、Y 坐标一致、残差 0Provider capability 增加 distanceX,原有生命周期和 Coincident/Parallel/Perpendicular 证据继续通过。WASM SHA-256 更新为 6c8688f61659d9e363d3fb8108a3709f56e047887101d093ea4125b7c888ff45;计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

165. 2026-08-06 SK-07 原生 distanceY 尺寸子集

原生 planegcs 增加 solveDistanceY:同样采用 FreeCAD ConstraintDifference,固定首点并以 Vertical 约束求解单线 Y 投影尺寸。Facade 只允许同线 start -> end 的正值 DistanceY 与 driving Vertical其他组合明确拒绝完整尺寸/参考图仍不宣称完成。

Chrome 150 Dedicated Worker 回放 DistanceY 状态 0、Y 差值 6、X 坐标一致、残差 0Provider capability 增加 distanceYNode smoke 与工件门禁通过。WASM SHA-256 更新为 737a901c25e5e21215c278c087047e56949b3694de4d53f822e78ab31b8f6db4;计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

166. 2026-08-06 FC-06 Chrome LinkSubList 语义增量

Chrome FCStd 语义 fixture 新增 App::PropertyLinkSubList,保存同一 Source 的 Face1/Face2 两项稳定 TopoRef检查从单 LinkSub 扩展为 LinkSubList并确认依赖图包含 topo-ref-list。Chrome 150 回放继续验证 Expression、Link、Sketcher、GuiDocument、BRep/ElementMap、OPFS archive round-trip 和 marker 删除,归档大小 1807 bytes。该切片补充 FC-06 的多选引用证据,不宣称完整 FCStd 全类型/全资源双向 round-trip计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

167. 2026-08-06 SK-07 原生 planegcs Angle 尺寸子集

原生 planegcs 增加 solveAngle:使用 FreeCAD 1.1.1 GCS::System::addConstraintP2PAngle,固定单线首端点,并以正值端点 Distance 保持长度。Facade 只接受恰好一个同线 driving Angle弧度与一个 start -> end driving DistanceDistanceX/DistanceY、任意端点、两线夹角和圆弧半径继续显式拒绝避免把受控子集当作完整尺寸图。

Chrome Dedicated Worker 回放 45 度、长度 5,原生状态为 0,长度残差约 4.2e-14、角度残差约 2.2e-16Provider capability 增加 anglecompleted/cancelled/recovered/stale 生命周期继续通过。WASM SHA-256 更新为 8940cce30dc9b083a851a04ee3a8b6136771f9ba46bb855b9116c4ce0d8c7ebe。该增量不关闭 SK-07计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

168. 2026-08-06 SK-07 原生 planegcs Circle Radius 子集

原生 planegcs 增加 solveCircleRadius:使用 FreeCAD 1.1.1 GCS::System::addConstraintCircleRadius,固定圆心并求解唯一的正值 Radius。Facade 只接受单个 Circle 和一个同对象 driving RadiusDiameter、Arc、圆与其他几何的关系、多约束图和参考尺寸继续显式拒绝避免将最小圆图当作完整 Sketcher 尺寸支持。

Chrome Dedicated Worker 回放圆心 (2,3)、目标半径 4,原生状态为 0、残差 0Provider capability 增加 radiuscompleted/cancelled/recovered/stale 生命周期仍通过。WASM SHA-256 更新为 7c407a1d350f2f69d463aac34758c26b66d1cb447baa348d3f68ebeb830b0108。该增量不关闭 SK-07计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

169. 2026-08-06 SK-07 原生 planegcs Circle Diameter 子集

原生 planegcs 增加 solveCircleDiameter:直接使用 FreeCAD 1.1.1 GCS::System::addConstraintCircleDiameter,其上游合同以 0.5 比例约束圆半径与直径。Facade 只接受单个 Circle 和一个同对象 driving Diameter固定圆心以得到确定的最小图Arc、圆与其他几何的关系、多约束图和参考尺寸继续显式拒绝。

Chrome Dedicated Worker 回放圆心 (2,3)、目标直径 8,原生状态为 0,圆半径为 4、直径残差 0Provider capability 增加 diametercompleted/cancelled/recovered/stale 生命周期仍通过。WASM SHA-256 更新为 3b304e663e8ee66f6df3ec78533ef5632c2875112e20992bbb5753c0a09472d3。该增量不关闭 SK-07计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。

170. 2026-08-06 SK-06/SK-07 原生 planegcs Equal 子集

原生 planegcs 增加 solveEqualLinessolveEqualCircles:前者直接使用 FreeCAD 1.1.1 GCS::System::addConstraintEqualLength,固定第一条线及第二条线起点后求解等长;后者使用 addConstraintEqualRadius固定两圆圆心及第一半径后求解第二半径。Facade 仅接受两条线或两个圆的单个 driving Equal混合几何、Arc/Ellipse、任意端点和多约束图显式拒绝。

Chrome 150 Dedicated Worker 验证两线长度均为 4、两圆半径均为 4,两类残差为 0,并验证 supportedGeometry: [line, circle]equal capability、completed/cancelled/recovered/stale 生命周期。Node smoke、Facade 165/165 和 artifact 检查通过WASM SHA-256 更新为 26744295035703ae26353d7f52144a33d19f0e99e2d223ec5060d1eef8919dee。该增量不关闭完整 SK-06/SK-07计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

171. 2026-08-06 SK-06 原生 planegcs Tangent 子集

原生 planegcs 增加 solveTangentCircles,直接使用 FreeCAD 1.1.1 GCS::System::addConstraintTangent(Circle, Circle)固定两个圆心和第一半径求解两个外切圆的第二半径。Facade 仅接受两个不同 Circle 的单个 driving Tangent线-圆、Arc、内切模式和多约束图继续拒绝。

Chrome 150 Dedicated Worker 回放圆心 (2,3)(10,3)、两个半径 4,切线残差约 8.9e-16Provider tangent capability、资源释放和 completed/cancelled/recovered/stale 生命周期通过。Node smoke、Facade 165/165 与 Chrome 检查通过WASM SHA-256 更新为 d63fb80d3b040c75bc037e1f8ee744ed99c039dea5ebd6c291bc7498237506fb。该增量不关闭完整 SK-06计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

172. 2026-08-06 SK-06 原生 planegcs 三点 Symmetric 子集

原生 planegcs 增加 solvePointSymmetry,直接使用 FreeCAD 1.1.1 GCS::System::addConstraintP2PSymmetric(Point, Point, Point)固定第一点与中心点求解第二点并返回中点残差。Facade 只接受三个互不相同的 Point 几何、三个 position 引用和一个 driving Symmetric线对称、端点对称、Arc/BSpline、多约束图继续显式拒绝。

Node smoke 回放 (1,2)(7,10) 关于 (4,6),求解状态 0、残差 0。Chrome 150 Dedicated Worker 回放同一合同,第二点为 (7.000000000002508, 9.99999999999955)、残差约 1.27e-12Provider capabilities 增加 point/symmetricFacade 生命周期和 OPFS/资源释放门禁继续通过。build:planegcscheck:planegcs-artifact、Chrome harness/check、Facade 165/165git diff --check 均通过WASM SHA-256 更新为 99c6c47c127802dac91539fa7b34ed389b453d126c821679b2d4c20af8f53abe

该增量不关闭完整 SK-06/SK-07PointOnObject、完整端点组合、几何图联合求解、冗余/冲突最小集、B-spline 与 FreeCAD 全量成功/失败 fixture 仍待完成;计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

173. 2026-08-06 SK-06 原生 planegcs PointOnObject 直线子集

原生 planegcs 增加 solvePointOnLine,直接使用 FreeCAD 1.1.1 GCS::System::addConstraintPointOnLine(Point, Line);水平线固定点 X垂直线固定点 Y目标点的另一坐标由真实约束投影返回点到直线的几何残差。Facade 只接受一个 Point position、一个非退化水平/垂直 Line 和单个 driving PointOnObject斜线、圆/弧目标、端点引用和多约束图继续显式拒绝。

Node smoke 与 Chrome 150 Dedicated Worker 将 (2,3) 投影到 (0,0)->(4,0),点收敛为 (2,0)、状态 0、残差 0Provider 增加 pointOnObject capability资源释放和 completed/cancelled/recovered/stale 生命周期通过。Facade 165/165、Chrome harness/check、artifact 检查和 git diff --check 通过WASM SHA-256 更新为 6a38158101bb96a3f36b1f2b59aa116b5f23e64142f94a29a841c9bab6b608f1

该增量仍不关闭完整 SK-06任意斜线/曲线 PointOnObject、完整端点组合、联合几何图和 FreeCAD 全量成功/失败 fixture 仍待完成;计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。

174. 2026-08-06 TSN-03 原生 Pipe history 闭环

原生 OCCT history 增加 BRepOffsetAPI_MakePipe 单边开放 Spine 子集Profile STEP 必须为平面 FaceSpine STEP 必须为单 Edge、两个端点原生 collector 通过 GeneratedFirstShapeLastShapeGenerated(Spine, Profile) 返回 Profile 顶点/边、端盖以及 Spine Edge/端点的可解释 Generated/Modified 关系。新增 pipeHistoryFromStepmakeLineWire Embind 导出Facade 协议、STEP bridge、Dedicated native Worker 和 geometry runtime 均声明 pipe 能力。

Node native smoke 验证结果为有效单实体、体积 20、28 条关系Chrome 150 + OPFS 回放验证 Profile/Spine 来源、结果体积 20、marker 创建读取删除,以及释放后的 ShapeHandle/kernelReference=0/0test:chrome-native-pipe-historycheck:chrome-native-pipe-historycheck:occt-upstream-drift 和 Facade 166/166 通过OCCT artifact SHA-256 已同步到 compatibility matrix 和 drift baseline。

Pipe 当前明确限定为单边开放实心扫掠;多边 Spine、Frenet/Transition、空心或多 Profile 仍显式拒绝,不据此宣称完整 FreeCAD PartDesign Pipe 已闭环。该证据完成 TSN-03 原生历史覆盖任务,计划计数更新为 31 completed、20 in_progress、32 pending、0 blocked

175. 2026-08-06 SK-06 原生 planegcs PointOnObject 圆子集

原生 planegcs 增加 solvePointOnCircle,直接使用 FreeCAD 1.1.1 GCS::System::addConstraintPointOnCircle(Point, Circle);固定圆心、半径和点 X由真实约束求解点 Y并返回点到圆的径向残差。Facade 将单 Point + 单 Circle 纳入 driving PointOnObject 子集,仍不把 Arc/Ellipse/BSpline 或多约束图声明为支持。

Node smoke 与 Chrome 150 Dedicated Worker 对圆心 (2,3)、半径 4、初始点 (4,6) 求解,点收敛到 (4,6.464101615137755),状态 0、残差 0Facade Provider 回放得到同一解。Facade 165/165、artifact、Chrome harness/check 均通过WASM SHA-256 更新为 b26a2fc6afa0a4e250a8dff578344a192af6b5fe1396b0868464b97eee42d25b

该增量继续推进 SK-06但完整 PointOnObject 的任意斜线、Arc/Ellipse/BSpline、端点引用和多几何图仍未闭环该阶段机器计划计数为 30 completed、21 in_progress、32 pending、0 blocked。

176. 2026-08-06 SK-06 原生曲线 PointOnObject、Block 与 Coincident 端点矩阵

原生 planegcs 继续增加三类真实曲线约束:solvePointOnArc 使用 addConstraintPointOnArc 并由 Facade 校验结果位于声明的逆时针弧段;solvePointOnEllipse 使用 addConstraintPointOnEllipse,保持中心、焦点、短半径以及由此恢复的长半径/旋转;solvePointOnCubicBspline 使用 addConstraintPointOnBSpline,当前严格限定为四控制点、三次、非周期、单位权重、夹持 knot 且控制点 X 严格单调的曲线。Chrome 150 结果分别为 Arc 点 (2,7)、Ellipse 点 (2,6.000000000037419) 和 B-spline 点 (2,1.500000000000298)/参数 0.5,三类均通过直接 Embind 与 Facade Provider 回放。

FreeCAD Block 按桌面 Sketch 的 pre-solve 语义落在 Facade单个被约束几何的全部参数保持不变DOF 为 0,不伪造不存在的 GCS Block API同时修正零 DOF 收敛结果此前仍标成 under-constrained 的状态映射。solveCoincidentLinePoints 则直接使用 addConstraintP2PCoincident,保留兼容的 first.end -> second.start 包装器,并将两条 Line 的 start/start、start/end、end/start、end/end 四种引用组合全部接入 Facade。Node 与 Chrome 双层矩阵均为状态 0/completed、选中端点重合、第二线长度保持 5

test:planegcs、Facade 166/166、Chrome harness/check、TypeScript 与 artifact 门禁通过;当前 JS/WASM SHA-256 分别为 64740c6c91360a3339c859fed0d91101f69f438033dd579d620e1de3ee51b784add952b864759a3245eb753c9fef63c4289bd3999cffa09f6b4fb5bbd78ae261。该增量移除 SK-06 的曲线 PointOnObject 和 Line Coincident 端点矩阵缺口但任意多几何联合约束图、InternalAlignment/SnellsLaw/Weight 的求解语义,以及 FreeCAD 全量成功/失败 fixture 尚未完成SK-06 保持 in_progress,机器计划计数保持 31 completed、20 in_progress、32 pending、0 blocked

177. 2026-08-06 SK-06 锁定 FreeCAD Sketcher 约束 oracle

新增真实 FreeCADCmd 约束 oracle固定到 FreeCAD 1.1.1 提交 0108fd4b4850cc46e625b60e53cea7a7bbe69f8d。Coincident、Horizontal、Vertical、Parallel、Perpendicular、Equal、Tangent、PointOnObject、Symmetric、InternalAlignment、SnellsLaw、Block 共 12 类约束各有一个成功 fixture 和一个无效几何索引失败 fixture24/24 全部通过,失败路径均记录原生 IndexError: Constraint has invalid indexes成功路径记录约束计数、求解状态和自由度。SnellsLaw 成功基线为 8 DOFBlock 为 0 DOF/fully constrained。

probe:freecad-sketcher-constraints 可重新运行桌面 oraclecheck:freecad-sketcher-constraints 校验锁定提交、12+12 覆盖和错误分类,后者已进入仓库 verify。这建立了 SK-06 的真实成功/失败比较基线,但 Web planegcs 的全部约束重载仍在继续接入,因此 SK-06 暂不标记完成。

178. 2026-08-06 SK-06 原生 SnellsLaw 三 Line 复合约束图

原生 planegcs 增加 solveSnellsLawLines,直接调用 FreeCAD addConstraintSnellsLaw。实现严格复现桌面语义:模型值存储 n2/n1ratio 大于等于 1 时取 n1=1,n2=ratio,小于 1 时取 n1=1/ratio,n2=1;法向翻转分别由第一射线选择 start 和第二射线选择 end 决定。绑定固定第一射线与边界、保持第二射线长度,并要求两个所选射线端点已重合且位于边界。

Facade 仅接受三个不同 Line 以及恰好一个 SnellsLaw、一个连接两射线所选端点的 Coincident、一个将第一射线端点放到边界上的 PointOnObject三者作为原子子图进入一次原生求解不完整或引用不一致的图明确拒绝。Node smoke、Facade 166/166、Chrome 直接 Worker 与 Facade Provider 均通过:状态 0/completed、第二射线长度 5、残差约 4.4e-16、Provider 为 8 DOF。JS/WASM SHA-256 分别更新为 702d267b856b8a1c9d1a031fbbd9780419c3e359a99d7d6922b5df668ed79d2ee62049ed4e3385f3e4a2a90ede42ea9940ab1add10cc6771ade43a66aa7e67d6

该增量关闭 SnellsLaw 的受控三 Line 复合图,但 InternalAlignment、Weight、更多 Tangent/Equal 重载和任意多约束图仍未完成SK-06 保持 in_progress,机器计划计数仍为 31 completed、20 in_progress、32 pending、0 blocked

179. 2026-08-06 SK-06 原生 Ellipse InternalAlignment 辅助几何图

原生 planegcs 增加 Ellipse 的 MajorDiameter、MinorDiameter、Focus1、Focus2 四种 InternalAlignment,分别调用 FreeCAD 1.1.1 的 addConstraintInternalAlignmentEllipseMajorDiameter...MinorDiameter...Focus1...Focus2。单项 Embind 回放验证每个辅助 Line/Point 的解析坐标Facade 的完整四约束集合则进入同一个 GCS::System 原子图,避免四次同步 Worker 求解造成浏览器长时间占用,并与桌面 oracle 的 5 DOF 基线一致。

Node smoke、Facade 166/166、Chrome 150 Dedicated Worker 和 Provider 均通过。椭圆中心 (2,3)、长短半径 5/3、旋转 0.25 保持不变,四项辅助几何误差和约束残差均小于 1e-7Provider 返回 completed、5 DOF。该受控图只覆盖单个完整 Ellipse 的四个内部辅助几何,不宣称任意 InternalAlignment 混合图或 B-spline 控点辅助几何已完整覆盖。

180. 2026-08-06 SK-06 原生 B-spline Weight 约束图

原生 planegcs 增加 solveCubicBsplineWeight,严格复现 FreeCAD 的隐藏几何语义:四控制点三次非周期夹持 B-spline 的目标控制点通过 addConstraintInternalAlignmentBSplineControlPoint 关联到辅助 Circle再由 addConstraintCircleRadius 施加 Weight。Facade 只接受四控制点、四权重、节点 [0,0,0,0,1,1,1,1] 的受控曲线和一个 driving Weight显式匹配的 B-spline control-point InternalAlignment 可与 Weight 一并作为同一原子图处理。

Node、Facade、Chrome 直接 Worker 与 Provider 回放均将索引 1 的权重从 0.75 收敛到 1.5,其余权重保持 [1,1.25,1],辅助圆为圆心 (1,2)、半径 1.5InternalAlignment/Weight 残差均为 0Provider 返回 completed、11 DOF。最终 JS/WASM SHA-256 分别为 702d267b856b8a1c9d1a031fbbd9780419c3e359a99d7d6922b5df668ed79d2e6acf170b2cb87c4287c1b814d899612d89048d9b0eac244a84c4916f07ca27d7

test:planegcs、TypeScript、Facade 166/166、Chrome harness/check 和 artifact 门禁通过。SK-06 的高级约束代理已有真实求解闭环,但更多 Tangent/Equal 重载、任意多约束图和逐类 Web 失败 fixture 仍待完成;因此 SK-06 保持 in_progress,机器计划计数仍为 31 completed、20 in_progress、32 pending、0 blocked

181. 2026-08-06 SK-06/SK-07 完整约束与诊断 oracle 收口

FreeCAD 1.1.1 Sketcher oracle 扩展到全部 19 种顶层约束类型:CoincidentHorizontalVerticalParallelTangentDistanceDistanceXDistanceYAnglePerpendicularRadiusEqualPointOnObjectSymmetricInternalAlignmentSnellsLawBlockDiameterWeight。每种类型各有一个桌面成功 fixture 和一个无效索引失败 fixture合计 38/38 通过Weight 成功项使用真实四控制点三次有理 B-spline、暴露内部几何并将权重设为 1.5

同一 oracle 新增 reference、redundant、conflicting 三类真实 FreeCAD 分类:参考尺寸保持非 driving 且输入 99 不改写几何,重复 Distance 返回求解码 -2 和 redundant [2],冲突 Distance 返回 -3 和 conflicting [1,2]。Chrome 诊断检查器逐项对照并验证 Web 的 under-constrained/conflicting、DOF、只读参考尺寸和诊断映射。check:freecad-sketcher-constraintscheck:chrome-sketcher-diagnostics、TypeScript、Facade 166/166 均通过SK-06 和 SK-07 转为 completed;机器计划计数为 33 completed、18 in_progress、32 pending、0 blocked

182. 2026-08-06 SK-11 PartDesign 多环轮廓消费增量

PartDesign 重算入口的 sketchProfile 从单环顺序线段解析改为无序多环提取:闭环按绝对面积选择外环,其余环作为孔进入统一 classifyPlanarProfile,并在调用 OCCT 前稳定返回 PROFILE_SELF_INTERSECTINGPROFILE_INVALID_NESTINGPROFILE_DEGENERATEPROFILE_NON_PLANAR。Facade 运行时测试确认孔在外环之前的输入仍以一个 hole 进入 Padbow-tie 与分离环在运行时调用前被拒绝。

Chrome 150 + OPFS profile harness 从 7 项扩展到 10 项,直接导入生产 sketchProfile 验证四点外环、一个孔及两类错误码marker 创建、读取、删除通过。test:chrome-profile-validationcheck:chrome-profile-validation、TypeScript 与 Facade 166/166 通过。SK-11 继续 in_progress,下一步锁定真实 FreeCAD PartDesign 对开放、多环、自交和非法嵌套轮廓的消费结果与错误文本分类。

183. 2026-08-06 SK-11 FreeCAD PartDesign profile 兼容收口

新增锁定到 FreeCAD 1.1.1 提交 0108fd4b4850cc46e625b60e53cea7a7bbe69f8d 的真实 PartDesign profile oracle。Body/Sketch/Pad 对闭合、带孔、开放、自交 bow-tie 和分离双环五类输入实际重算:闭合与带孔分别为单实体、体积 360/320;开放线框 Shape 为空,状态 Touched/Invalid,原生文本为 Wire is not closed.FreeCAD 1.1.1 接受 bow-tie 与分离双环为双实体,体积为 80/370。这纠正了此前将后二者提前拒绝的 Web 行为。

sketchProfile 现在在线段交点处分割平面图,通过半边角度遍历提取正面积有界面,并按包含深度组装外环、孔与 additionalRegions。Bitbybit 运行时逐区域建 Face/拉伸,多个结果以 OCCT Compound 返回placement 也覆盖附加区域。Chrome 150 + OPFS 的 12 项回放直接使用生产 parser 和真实 OCCT得到与 FreeCAD 相同的体积 360/320/80/370、实体数 1/1/2/2,开放线框在运行时调用前稳定返回 PROFILE_OPENprobe/check:freecad-partdesign-profiles、Chrome harness/check、Facade 166/166、TypeScript 和执行计划检查通过SK-11 转为 completed,机器计划计数为 34 completed、17 in_progress、32 pending、0 blocked

Bitbybit BRep graph validator 对两个既有单实体拉伸仍报告 structuralValid=false20/40 个结构错误),但 Shape 类型、体积、实体数和网格均正确Compound 双实体报告为有效。该质量判定差异已保留在 Chrome 报告中,不作为 SK-11 的 FreeCAD profile 消费结果伪装或删除,后续由质量/内核门禁继续追踪。

184. 2026-08-06 SK-09 交互编辑与键鼠生命周期收口

新增锁定 FreeCAD 1.1.1 的 Sketcher editor oracle真实调用 moveGeometrysplitextendtrimtoggleConstruction 与 Document transaction。七项结果全部通过Horizontal 约束拖动将目标端点保持在 (8,2) 并把另一端移到同一 YSplit 在 (4,0) 生成两段 construction Line 和 CoincidentExtend 将长度 10 墠量 5 到端点 (15,0)Trim 借助 x=7 切割线生成端点 (7,0) 和 PointOnObjectconstruction 切换为 true事务 Undo/Redo 在端点 8→5→8 间恢复Coincident+Horizontal 自动约束以 0 状态求解并收敛连接点。

Web 编辑语义同步修正:受 Horizontal/Vertical 约束的 drag 优先保持被拖点并移动同线另一端Split 添加稳定 ID 的 CoincidentTrim 命中其他 Line 时添加 PointOnObject。新增 SketchEditorInteractionSession,统一管理工具、指针手势、选择、事务历史以及 Ctrl/Cmd+ZCtrl/Cmd+YEscapeDelete。Chrome 150 harness 真实分发 3 个 PointerEvent 和 3 个 KeyboardEvent9 项操作/生命周期证据与 FreeCAD oracle 逐字段一致OPFS marker 创建、读取、删除通过。check:freecad-sketcher-editor、Chrome harness/check、Facade 167/167、TypeScript 和执行计划检查通过SK-09 转为 completed,机器计划计数为 35 completed、16 in_progress、32 pending、0 blocked

185. 2026-08-06 SK-10 B-spline 编辑与约束往返收口

Chrome 150 B-spline harness 已覆盖 poles、knots、weights、degree 和 periodic 五类编辑,并验证非法 degree、knot、weight 与 periodic 输入的稳定错误。浏览器内创建的四控制点三次有理 B-spline 同时携带索引 1 的 Weight=1.5、索引 2 的 control-point InternalAlignmentWeight=1.25,导出后再次导入 FCStd几何与约束逐字段一致归档大小为 1493 字节,权重为 [1,1.5,1.25,1],节点保持夹持形式。

同一检查器交叉读取真实 planegcs Worker/Provider 和 FreeCAD 1.1.1 oracleWeight 与 InternalAlignment 残差均为 0Provider 返回 completed、11 DOFFreeCAD Weight fixture 求解状态和残差均为 0test/check:chrome-sketcher-bsplinecheck:chrome-planegcs、Facade 167/167、TypeScript 与 diff 门禁通过SK-10 转为 completed,机器计划计数为 36 completed、15 in_progress、32 pending、0 blocked

186. 2026-08-06 SK-12 500 模型 Sketcher 压力套件收口

确定性压力套件以种子 539363331 生成 500 个模型并各求解两次,共 1000 次求解constraints、conflict、redundant、reference、drag 五类各 100 个。Node 和 Chrome 150 都得到摘要 edac8aed,最大迭代数 64、最大残差 4.577566798522237e-16,确定性差异和意外结果均为 0Chrome 实测总耗时约 15.4 ms,低于 2000 ms 预算OPFS 的 SK-12 marker 已创建、读取并删除。

压力结果同时通过真实 FreeCAD 1.1.1 约束分类与 editor oracle 门禁reference、redundant、conflicting 分类 3/3 通过drag/编辑行为 7/7 通过Chrome diagnostics 与真实 Pointer/Keyboard editor 回放也通过。test/check:chrome-sketcher-stresscheck:freecad-sketcher-constraintscheck:freecad-sketcher-editor 及相关 Chrome 检查全部通过SK-12 转为 completedP04 全部完成,机器计划计数为 37 completed、14 in_progress、32 pending、0 blocked

187. 2026-08-06 PART-ALL 三格式 100 模型黄金收口

Chrome 150 FCStd 黄金套件在既有 STEP/IGES 之外增加 BREP 显式导出、重新导入、结构与质量属性比较。锁定的 100 个 Part 场景全部通过STEP/IGES/BREP 分别 100/100最大体积差依次为 9.242739906767383e-105.097643906992744e-81.8189894035458565e-12BREP 保持 100 个模型的原始拓扑容器,无结构归一化,最终 ShapeHandle/kernel reference 为 0/0。检查器现在强制三种格式各 100 项,并对 Shape 类型汇总采用稳定键序。

Part 的 Box/Cylinder/Sphere/Cone、Ellipsoid/Torus/Prism/Wedge/Helix、Fuse/Cut/Common以及 Extrude/Revolution/Loft/Pipe/Fillet/Chamfer/Draft/Thickness 等 Builder/Modification 和质量检查已有实际 Chrome Worker 证据FreeCAD fixture 门禁覆盖 100 个成功与 50 个失败场景,语义比较未知差异为 0test/check:chrome-fcstd-golden、Part primitive/geometry feature、FreeCAD golden/comparator 与 TypeScript 门禁全部通过PART-ALL 转为 completed,机器计划计数为 38 completed、13 in_progress、32 pending、0 blocked

188. 2026-08-06 PD-BASE 全模式与原生历史收口

Pad/Pocket 的 TaperAngle 已进入 Facade 类型与 Bitbybit OCCT 实几何执行;平面 polygon 使用平行偏移后直纹 Loft 构造锥度,角度符号按 FreeCAD 1.1.1 实测对齐。Pad/Pocket 重算支持 Up to face 稳定 TopoRef、Through allMidplaneTwo sides 和双锥度分向执行;同时修正 Through-all 刀具体跨度确保草图位于基体表面时仍贯穿整个实体。Revolution/Groove 的 Midplane 与 Two angles 组合路径继续由正反轴原生操作完成。

新增 FreeCAD 真实 PartDesign::Body/Sketch/Pad/Pocket oracle5/5 锁定锥度 Pad 98.77344374611019、锥度 Pocket 810.4374375507407、Through-all/Up-to-face Pocket 各 960、Midplane Pad 96。Chrome 150 几何门禁扩为 30 个非空操作,同五项体积与 FreeCAD 在 1e-7 内一致,释放后 ShapeHandle/kernel reference 为 0/0;参数生命周期验证 42→31→42 的重算和 UndoPad/Pocket/Revolution/Groove 原生 OCCT history 分别为 25/42/23/2 条。Facade 167/167、TypeScript、FreeCAD/Chrome checker 均通过PD-BASE 转为 completed,机器计划计数为 39 completed、12 in_progress、32 pending、0 blocked

189. 2026-08-06 PD-LOFT 四特征与双故障恢复收口

Chrome 150 Facade 场景从旧版“AdditivePipe 预期失败”升级为 AdditiveLoft、AdditivePipe、SubtractiveLoft、SubtractivePipe 四类实际成功特征;四个 Body.Tip 结果体积依次为 504/524/512.0000000000001/511.0000000000001Pipe 使用 FreeCAD 默认 Transformed transition。重复 Loft section 触发 LOFT_SECTIONS_DUPLICATE,分叉 Pipe path 触发 PIPE_PATH_BRANCH;两次失败均保留原 Shape ID修复属性后重算恢复。版本 70 经 sqlite-opfs 保存/加载后 Tip 仍为 subtractive-pipe,释放后 ShapeHandle/kernel reference 为 0/0

新增 FreeCAD 1.1.1 真实 PartDesign::AdditiveLoft/SubtractiveLoft/AdditivePipe/SubtractivePipe oracle4/4 有效单实体,体积锁定为 1/1/π/(100-π) 且 Pipe transition 为 Transformed。Chrome Loft/Pipe 原生 OCCT history 分别记录 24/28 条并释放为 0/0Chrome、FreeCAD 与 native-history checker、TypeScript 均通过。PD-LOFT 转为 completed,机器计划计数为 40 completed、11 in_progress、32 pending、0 blocked

190. 2026-08-06 PD-DRESSUP 稳定选择与歧义恢复收口

PartDesign Fillet/Chamfer 命令现在把用户选中的稳定 Edge 写入 PropertyLinkSubBody.Tip 随特征更新Thickness 重算补齐 Reversed 符号语义。Chrome 150 Facade 场景在非对称 Hole 基体上连续创建 Fillet、Chamfer、Draft、Thickness再串联 Mirrored、LinearPattern、PolarPattern、MultiTransform 和最终 Hole共 10 个正体积结果。注入歧义 Edge 时返回 DRESSUP_EDGE_REFERENCE_UNRESOLVED 并保留上一 ShapePad 42→31 编辑后Draft 面稳定迁移Fillet/Chamfer/Thickness 三项保守报告 TOPOLOGY_REFERENCE_AMBIGUOUS,迁移统计为 stable=1/ambiguous=3/diagnostics=3/wrongBindings=0。版本 37 经 sqlite-opfs 保存/加载后 Tip 为 hole001,释放后 ShapeHandle/kernel reference 为 0/0

新增 FreeCAD 1.1.1 真实 PartDesign::Fillet/Chamfer/Draft/Thickness oracle4/4 有效:体积锁定为 997.8539816339743/995/1500/424,选边/选面、Draft reversed、Thickness reversed 与拓扑数量均有断言。Chrome 原生 OCCT history 分别记录 150/150/5/38Facade 167/167、Chrome、FreeCAD、native-history 与 TypeScript 检查均通过。PD-DRESSUP 转为 completed,机器计划计数为 41 completed、10 in_progress、32 pending、0 blocked

191. 2026-08-06 PD-TRANSFORM Feature-list、单实体与 Hole 线程收口

LinearPattern、PolarPattern、Mirrored 和 MultiTransform 现同时支持 Whole shape 与 Feature-list 语义。Feature-list 从 Originals 的 source/base 差分恢复 additive/subtractive 工具,再按显式方向、轴或平面应用到当前 supportMultiTransform 按步骤顺序展开。每个 PartDesign 结果在拓扑提交前执行真实 OCCT 质量报告并要求恰好一个 solid非法非连接结果稳定返回 PARTDESIGN_SINGLE_SOLID_REQUIRED。变换任务属性和界面补齐 OriginalsPlaneOrigin/PlaneNormalDirectionVectorAxisOrigin/AxisDirection

Hole 增加 ISO Metric/Fine、UNC/UNF/UNEF、NPT、BSP、BSW/BSF 与 ISO Tyre 标准合同,支持规格或显式 major/pitch、Right/Left、线程深度和 clearanceModelThread 使用真实 Helix + solid pipe 对预钻孔执行螺旋切削。Chrome 150 的 14 步链得到 14 个正体积单实体,其中 Feature Linear/Mirrored 体积 357.3810870283411/354.26859542168523M1 化妆线程为 363.66427233552065,三圈 M2x0.4 左旋模型线程为 347.12633973440813。版本 41 经 sqlite-opfs 重开后 Tip 为 hole003ShapeHandle/kernel reference 最终 0/0

FreeCAD 1.1.1 oracle 的 Feature-list LinearPattern/Mirrored 均为有效单实体、体积 423.99999999999994/416.00000000000006ISO M6 tap drill 和左旋 modeled thread 分别为 3842.92036732051/3820.1907618181585,并确认原生 Hole 不存在独立 ThreadPitch 属性。Linear/Polar/Mirrored/MultiTransform 原生 OCCT history 分别为 66/68/66/311 条。Facade 167/167、TypeScript、Chrome、FreeCAD 与原生历史门禁通过PD-TRANSFORM 转为 completed,机器计划计数为 42 completed、9 in_progress、32 pending、0 blocked

192. 2026-08-06 PD-CLOSURE 全参数化生命周期收口

Chrome PartDesign lifecycle 增加真实 Shape 新鲜度证据初始、Pad 42→31 编辑、Undo 回到 42、OPFS 加载后显式重算四阶段的 Shape ID 均不同,体积为 504→372→504→504,每阶段均为一个 solidBody.Tip 始终是 padSketch.Support 始终是 XY_Plane。结构生命周期同时验证非法依赖重排/删除原子拒绝、Fillet 删除使 Tip 回退 Pocket、Undo/Redo 在 Fillet/Pocket 间恢复 Tip且最终 ShapeHandle/kernel reference 为 0/0

新增 check:partdesign-closure 聚合门禁并纳入 verify:基础 Pad/Pocket 五种模式、Additive/Subtractive Loft/Pipe 四种任务、dress-up/transform/Hole 14 步任务链全部要求正体积 Shape、正确 Tip/Base 和唯一 Shape IDLoft 重复 section、Pipe 分叉 path、Fillet 歧义 TopoRef 三种失败均要求保留上一 Shape修复后生成新 Shape。lifecycle、Loft、Transform 三套 sqlite-opfs 重开分别保持 Tip pad/subtractive-pipe/hole003Pad、Pocket、Loft、Pipe、Revolution、Groove、Fillet、Chamfer、Hole、Draft、Thickness、Linear/Polar Pattern、Mirrored、MultiTransform 共 15 类原生 history 均通过并释放资源。PD-CLOSURE 转为 completedP05 全部完成;机器计划计数为 43 completed、8 in_progress、32 pending、0 blocked

193. 2026-08-06 P06 FCStd 双向 round-trip 全任务收口

新增 check:fcstd-closure 并纳入全量 verify。锁定 FreeCAD 1.1.1 提交的原生报告现有 22 个 FreeCAD→Web→FreeCAD / Web→FreeCAD→Web 场景,覆盖 Part/Boolean/Builder、Sketcher 核心与 ExternalGeo/Attachment/SnellsLaw/Weight/InternalAlignment、Shape/ElementMap/StringHasher 和只读 proxy22/22 differences=[],未知对象归档 49349 bytes 与 SHA-256 逐字节不变。Chrome FCStd semantic/round-trip 同时验证 Expression、Link、LinkSub/LinkSubList、TopoRef、Sketcher、GuiDocument、BRep/ElementMap、双方向差异分类、sqlite-opfs 和 0/0 释放。

100 模型 FCStd+BRep 黄金的 FCStd/STEP/IGES/BREP 各 100/100 通过STEP/IGES/BREP 最大体积差分别为 9.242739906767383e-10/5.097643906992744e-8/1.8189894035458565e-12STEP/IGES 明确毫米单位,未知差异为 0。次级格式从 6 个扩为 8 个,形成 2D DXF/SVG/PDF、Mesh OBJ/PLY/STL、BIM IFC、data CSV 矩阵Chrome 150 对每个格式都验证成功导入、错误签名拒绝、确定性导出和 export→import→exportRecord 字节精确回环OPFS marker 为 8 且资源归零。代理导入继续明确标记 proxy不声称原生几何语义。

新增 FC-11 集中硬化门禁:能力内 1,048,916 byte FCStd/1 MiB payload 正常解析archive bytes、entry bytes、总解压、entry count、压缩率、截断 ZIP、XML 深度、XML nodes 和 malformed XML 九类输入均显式拒绝STEP 分块 UTF-8、途中 AbortError、非法编码、流上限和项目双 checkpoint 恢复通过。FC-04/05/06/08/09/10/11 与既有 FC-07 全部转为 completedP06 完成;机器计划计数为 50 completed、5 in_progress、28 pending、0 blocked

194. 2026-08-06 P07 文档工作台全任务收口

TechDraw 增加 GD&T 容差对象及确定性 PDF 生成器Chrome 150 验证两视图、一剖视、尺寸源更新、删除 TopoRef 后的视图/容差 unresolved、SVG 与 872 byte 有效 PDF。Spreadsheet 的 100x100 大表在 Chrome 中完成 10,000 单元格求值和 175112 byte CSV0 个求值错误,耗时约 53.85 ms。Draft 增加事务式 trimLine,变换后的长度由 8 修剪为 4Offset、Array、Clone、Layer 和 5 个源依赖保持参数化。Plot 使用真实浏览器 SVG 解码和 Canvas 编码导出 640x36019408 byte PNG两次 SHA-256 一致并通过 PNG 签名检查。

生产文档 harness 不再使用占位计数:它实际创建并编辑 Spreadsheet、Draft、TechDraw、Plot导出 CSV/JSON/SVG/PDF四个 artifact 版本均为 2、文档版本为 8sqlite-opfs 保存、字节往返、释放、重开和依赖闭包全部通过。新增 check:document-closure 聚合门禁并纳入 verifyTypeScript、五组模块单测、五组 Chrome 回放和各检查器全部通过ShapeHandle/kernel reference 均为 0/0。TD-ALL、SS-ALL、DRAFT-BASE、DRAFT-OPS、PLOT-ALL、DOC-CLOSURE 转为 completedP07 完成;机器计划计数为 56 completed、5 in_progress、22 pending、0 blocked

195. 2026-08-06 P08 工程工作台全任务收口

Assembly 增加确定性 motion frames 和可移动 angle joint 求解Chrome 使用独立 module Worker 重放 fixed/coincident、distance 与 angle1000 组件/10 BOM 行构建约 6.69 msFCStd 中 4 个对象和一个 App::Link 经归档、inspect、重开及 OPFS 释放。BIM 增加 Site/Building、分类以及 IFC2X3/IFC4 显式 schema 导入摘要;单模型包含 4 个层级实体、1 个 PropertySet、1 个 Classification两个 schema 实体数一致。

Mesh 增加自交计数、OBJ/PLY/STL 和 LOD独立 Worker 与同步 LOD 均得到 6 个三角形;闭合 box 为 0 边界/0 非流形/0 退化/0 自交,负例分别得到自交 1、非流形边 1、孔修补面 1。Surface 增加 Fill、Offset 和稳定边界 TopoRefChrome 验证 5 patches、20 poles、C0、trim/sew、1.5 offset 和 4 个 refs。

工程闭包实际串联四个模块,四个 artifact 版本均为 2、项目版本 8Assembly placement、BIM FireRating、Mesh transform、Surface offset 均编辑并导出1000 组件预算约 5.04 mssqlite-opfs 字节往返、释放、重开和 sourceRef 完整性通过。新增 check:engineering-closure 并通过 check:chrome-engineering 纳入 verifyASM-CORE、ASM-TOOLS、BIM-CORE、BIM-IFC、MESH-CORE、SURF-CORE、ENG-CLOSURE 转为 completedP08 完成;机器计划计数为 63 completed、5 in_progress、15 pending、0 blocked

196. 2026-08-06 P09 平台工作台全任务收口

FEM 增加命名节点集、明确的 local-reference 求解策略和 displacement/stress 结果场Chrome 参考杆求解得到最大位移 0.00125 mm、最大应力 25 MPa。CAM 增加 GRBL/LinuxCNC 白名单后处理、非法 post 拒绝、确定性 G-code 哈希和碰撞负例。Robot 增加三轴正运动学、6 单位工作空间、碰撞检测与控制器导出。Inspection 增加偏差、24 面积截面和稳定/歧义 TopoRef 报告。

专业数据模块保持 7 项逐一登记,其中 2 个受支持适配器、5 个显式 proxyAddon 的伪造摘要/越权请求均拒绝并完成更新、回滚、删除Script 宏回放显式拒绝 file/network/time/resource 四类能力。七套 Chrome 150 + cross-origin isolation + sqlite-opfs 报告均通过,资源与 ShapeHandle 归零。

新增锁定 34 个 FreeCAD 模块的 platform-module-coverage.jsoncheck:platform-closure 聚合门禁,结果为 24 compatible、7 proxy、3 development、0 unexplained且每项均关联现存可执行证据。FEM-ALL、CAM-ALL、ROBOT-ALL、INSP-ALL、DATA-ALL、ADDON-ALL、SCRIPT-ALL、PLATFORM-CLOSURE 转为 completedP09 完成;机器计划计数为 71 completed、5 in_progress、7 pending、0 blocked

197. 2026-08-07 P10 QA/REL 全任务收口

生产构建先修复 tsc -b 暴露的 Assembly 可选依赖、Mesh Worker TypedArray、Planegcs SnellsLaw 联合约束和 PartDesign 多 ring 类型错误,./npmw run build 通过并生成 14 项 PWA precache含 OCCT/SQLite WASM。Chrome 150 app E2E 回放 8 个流程Part Design/Sketch/Loft task、保存重开、导入导出、桌面布局和移动布局初始 canvas source 为 bitbybit-occt,任务态 canvas 736×664、18 色、WebGL error 0,截图为 175467/135649 bytes 且哈希校验通过。

QA-01/02 的 24 套测试、217 个用例、100/50 golden、19 类 Sketcher、17 类 PartDesign 和 22 个 FCStd round-trip 通过QA-04 三套固定种子 fuzz 完成 1000 + 2000 + 2000,确定性/错误分类/P95 全部通过。QA-05 实测 1000 对象、1000000 三角形、100000 表格单元、堆 34939773 bytesQA-06 Worker/WASM 崩溃恢复、取消、stale、OPFS 1→6 迁移和 6+6 回滚通过QA-07 四类恶意输入、权限、Addon、Script、CSP 和 npm critical audit 均为 0 critical。

QA-08 覆盖 3 locale、长文本和单位格式、4 个语义控件;真实应用 165 个 AX 节点中 16 个控件全部命名8 步 Tab 全部命名390px 无横向溢出。REL-01 离线 cache 回退/旧 cache 删除/WASM precache 通过REL-02 schema 1→6、checkpoint、恢复完整性和中断回滚通过REL-03 CycloneDX SBOM 172 组件、依赖 critical=074 个 dist 文件以 Ed25519 签名并由受控公钥验签。

新增 release-capability-matrix.jsondocs/release-runbook.zh-CN.mdcheck:quality-closurecheck:release-closure。最终矩阵 G0-G9 全部 pass34 模块为 exact=0/compatible=24/proxy=7/development=3/unsupported=0,无 scope-only/unexplainedQA-01..QA-08、REL-01..REL-04 转为 completedP10 完成。机器计划计数为 83 completed、0 in_progress、0 pending、0 blocked

198. 2026-08-07 后续对标Points/ReverseEngineering 浏览器可移植子集

P01-P10 完成后继续对照 FreeCAD 1.1.1 源码命令表,优先关闭两个仍为代理的数据模块。src/facade/dataModules.ts 新增版本化点云对象和拟合结果:

  • Points 支持 ASCII ASC/PTS/XYZ/CSV/PCD/PLY 导入与确定性导出,导入时校验 UTF-8、格式签名、PTS 声明计数、有限坐标、8 MiB 字节上限和 100 万点上限PCD/PLY 的二进制/E57 路径继续明确拒绝。
  • 对应 Points_ConvertPoints_MergePoints_PolyCutPoints_Structure 的可移植语义已接入平移、合并、AABB/XY 多边形裁剪、体素降采样和 XY 结构化网格;每项产生独立派生点云,源对象不变。
  • ReverseEngineering 对点云增加稳定平面、球体、圆柱和二次多项式曲面最小二乘拟合,以及半径邻域区域分割,输出 origin/axis、尺寸/系数、RMS、pointCount、簇标签和 sourceId共线点集和矩阵退化会返回结构化错误。
  • Node 5 项数据测试和 Chrome 150 + OPFS 实跑均通过6 点源、PTS/PCD/PLY 解析、12 点合并、AABB/多边形裁剪各 4 点、1 点降采样、3×2 网格、六格式导出、平面 RMS 1.725911830690932e-16、球半径 2、圆柱半径 3/高度 8、多项式 RMS 0、两个各 2 点的分割簇、sqlite round-trip 和释放后 ShapeHandle/kernel reference=0/0

config/platform-module-coverage.jsonconfig/release-capability-matrix.json 已同步为 exact=0/compatible=26/proxy=5/development=3/unsupported=0check:chrome-datacheck:platform-closurecheck:execution-plancheck:release-closure 和完整 ./npmw run verify 通过。剩余差异集中在 E57/二进制点云、Poisson/区域生长/完整 B-spline 曲面重建,以及 OpenSCAD/IDF/JT/Cloud/Help 等安全或缺少浏览器运行时的代理边界。

199. 2026-08-07 FreeCAD UI/交互对标任务领取

P01-P10 的 83/83 和当前 Chrome E2E 证明核心流程可运行但不等于网页端菜单、工具栏、工作台、Combo View、Task panel、Data/View 属性、对话框、快捷键、上下文菜单、状态栏及操作顺序已经与 FreeCAD 桌面端一致。执行 WBS 新增第 18 节,将 UI 对标固定到 FreeCAD 1.1.1/提交 0108fd4b4850cc46e625b60e53cea7a7bbe69f8d,并明确“视觉类似”不能作为完成证据。

后续任务已按 UI-19..UI-30 分派ORACLE+QUALITY 先建立完整 GUI manifest、截图和焦点/命令 oracleCORE 主责应用壳、菜单、工具栏、工作台、Combo/Task/Property 和对话框TOPO 主责树/视口选择及上下文语义IO/PLATFORM 负责文件、权限和领域对话框;各工作台 owner 负责本域菜单、Task 和逐步使用流程QUALITY 最终关闭视觉、键鼠、无障碍、窄屏和差异矩阵。

连续依赖链为 UI-19 -> UI-20/UI-21 -> UI-22 -> UI-23/UI-24 -> UI-25/UI-26/UI-27/UI-28 -> UI-29 -> UI-30。任务建立后已立即领取 UI-19..UI-28当前为 0 completed / 10 in_progress / 2 pending / 0 blocked,不会篡改已收口的 P01-P10 机器计数。每项必须同时有 FreeCAD GUI oracle、Chrome 真实交互、成功/失败/取消、键盘焦点、桌面/390px 截图、无溢出/遮挡和资源释放证据;浏览器原生文件选择器、系统窗口装饰及保留快捷键只能作为显式 compatible 差异,不能隐藏或伪装为 exact

本轮实现已将工作区重排为 FreeCAD 桌面式菜单、标准/工作台工具栏、文档标签、左侧 Combo ViewModel/Tasks、中央视口、右侧 Selection View、Report/Jobs/Diagnostics 和状态栏补齐命令搜索、Preferences、About、Macro、关闭/删除确认对话框,以及模型树可见性/重命名/重算/删除上下文菜单。视口适配器增加标准视图、Fit All 和缩放,交互仍只经过 Facade。

Chrome 150 生产回放现覆盖 13 条流程:除 File 菜单、命令搜索、Preferences/About、模型树右键、Part Design 工具栏、Combo/Selection/状态栏外,新增 CAM 工作台 Job 流程。CAM 流程验证 4 个工具栏组、60 个命令、5 个菜单组、Job/Tool/Operation/ToolBit Load/Drilling/Drag Knife Task、7 行 Job 树、生成状态、5 个三维刀路点及图例;桌面和 390px 均无横向溢出3 张截图为有效 PNG页面错误为 0。buildtest/check:chrome-app-e2egit diff --check 通过。完整 FreeCAD GUI/CAM 动态 oracle 尚未建立,因此上述任务保持 in_progress,不以截图替代逐状态 exact 对照。

最终复核还通过了 167 项 Facade 测试、230 项单元测试、质量闭环和现有 10 项 release closure。全量 verify 运行到发布产物生成时按预期拒绝了新构建UI/CAM 变更后的构建摘要已不同于现有已签名清单,而当前环境没有 RELEASE_SIGNING_PRIVATE_KEY/RELEASE_SIGNING_KEY_ID;后续发布 owner 必须在签名环境重新生成发布清单,不能把旧清单的签名状态继承给本次构建。

200. 2026-08-07 CAM 完整对标任务领取与浏览器实现

继续对标 FreeCAD 1.1.1/0108fd4b4850cc46e625b60e53cea7a7bbe69f8dCAM 已从原 CAM-ALL 的最小兼容合同扩展为可操作的工作台4 个工具栏组和 5 个菜单组共 60 个 FreeCAD 命名可操作命令Job 树包含 Model、Stock、SetupSheet、Tools/Controllers 和 OperationsJob、ToolBit/Controller、Operation/Dress-up、Post 均有 FreeCAD 风格 Task视口显示按工序着色的三维刀路。

Facade 现覆盖 4 种 Stock、7 种 ToolBit、22 种工序、9 种 dress-up 和 7 个 allowlisted post并提供 ToolBit JSON 导入/导出、更新/依赖安全删除和刀路起点调整。Chrome CAM 回放实际建立 2 把刀、2 个控制器、Profile/Pocket/Drilling 3 个工序、23 个路径点和 1 个 dress-up通过 Sanity、仿真、无碰撞正例、1 个碰撞负例、7 组稳定 post 哈希、sqlite-opfs 往返和资源归零;真实应用 CAM 流程同时验证 60 个菜单项以及 Job/Tool/Operation/ToolBit Load/Drilling/Drag Knife Task、7 行 Job 树、5 点可见刀路、图例和零横向溢出。

新建 config/freecad-cam-parity.jsoncheck:cam-parity,强制 60 个 Web 命令全部存在于 FreeCAD GUI 清册56 个 runtime-probed、4 个 source-only另将 CAM_%s 动态模板单独排除。机器合同将“兼容浏览器子集、非 exact 全量对标”作为可检查声明。任务已按 CAM-21..CAM-32 分派给 ORACLE、PLATFORM、CORE、KERNEL、TOPO、IO/DOC 和 QUALITY连续链为 CAM-21 -> CAM-22/CAM-23 -> CAM-24 -> CAM-25 -> CAM-26/CAM-28 -> CAM-27 -> CAM-29/CAM-30 -> CAM-31 -> CAM-32;当前 2 completed / 9 in_progress / 1 pending / 0 blocked

仍未关闭的是原生 Path 算法/几何语义、完整 Qt CAM 动态 UI oracle、OpenCamLib/CAMotics、原生实体材料去除与刀柄/夹具碰撞 oracle、4/5 轴、原生 Path FCStd 对象往返,以及具体机床/控制器 dry-run 与安全认证。因此 P01-P10 继续保持 83/83,原 CAM-ALL 仍是已通过的 compatible gate但不升级为 FreeCAD CAM exact parity 声明。

201. 2026-08-07 CAM 全命令面与 ToolBit/Path 扩展

FreeCAD GUI 清册中的 CAM 命令已完成可操作面分区56 个 runtime 命令与 4 个 source-only 可操作命令共 60 个,动态占位模板 CAM_%s 不作为按钮或菜单项。菜单和工具栏由同一 manifest 生成,保持 5 个菜单组、4 个工具栏组和 60 个唯一命令 IDnotYetSurfacedCommands 降为 0。

浏览器 CAM 域扩展到 22 种工序和 9 种 dress-upDogbone 与 Drag Knife 产生真实路径变换ToolBit 支持版本化 JSON 导入/导出、更新和依赖安全删除Tool Controller 同样支持更新/安全删除,已生成闭合路径可调整起点。应用层已接通 ToolBit Load/Save/Save As、全部显式工序与 dress-up、Simulator/SimulatorGL、Copy、Set Start Point、Stop 和模板导出CAMotics、原生 Path metadata 对象等缺少浏览器等价运行时的功能继续显示明确边界。

Node CAM 测试为 12/12Chrome CAM harness 实际构造全部 22 种工序、9 种 dress-up、ToolBit/Job asset round-trip、Undo/Redo、起点变化、23 点材料去除时间线、fixture collision 和 4/5 轴限位/post 证据,应用 E2E 实际打开并取消 Fixture、ToolBit Load、Drilling、Drag Knife、Post 5 轴五类新增 Task。质量闭环为 24 套、230 项单元测试、13 条真实应用流程和 3 张截图。CAM 任务状态为 2 completed / 9 in_progress / 1 pending / 0 blocked,因为原生 Path 数值/拓扑 oracle、FCStd Path 对象、原生实体去料、连续工具轴求解和机床认证尚未满足 exact 验收条件。

CAM-27 的浏览器兼容实现进一步加入 materialRemovalTimeline()collisionReport():材料去除使用有上限的 2D column raster记录分辨率、网格、feed 时间、采样数、累计去除和剩余体积,重叠刀路不会重复扣料;碰撞使用连续刀路线段的 swept envelope区分 holder-stock、cutter-fixture 与 holder-fixture并记录路径索引、碰撞点、侵入量和间隙。两套报告均明确 nativeEquivalent:false,因此不会被误用为 FreeCAD/OCL 原生实体仿真的 exact 证据。

CAM-29 已进入执行:版本化 Job 资产保存 Stock、SetupSheet、全部 ToolBit/Controller、Operation/Dress-up、生成路径、Fixture、材料去除开关和版本导入限制 16 MiB、集合/刀路点数量、类型枚举、有限坐标、引用完整性、刀号唯一性和 Job 身份非法输入不会产生半恢复状态。Undo/Redo 以 100 个快照为上限并覆盖导入事务Chrome 实测 Job asset 字节一致往返和 toggle/undo/redo 状态恢复。该证据只关闭网页资产生命周期,原生 Path FCStd 对象仍未完成。 CAM-29 已进入执行:版本化 Job 资产保存 Stock、SetupSheet、全部 ToolBit/Controller、Operation/Dress-up、生成路径、Fixture、材料去除开关和版本导入限制 16 MiB、集合/刀路点数量、类型枚举、有限坐标、引用完整性、刀号唯一性和 Job 身份非法输入不会产生半恢复状态。Undo/Redo 以 100 个快照为上限并覆盖导入事务Chrome 实测 Job asset 字节一致往返和 toggle/undo/redo 状态恢复。该证据只关闭网页资产生命周期,原生 Path FCStd 对象仍未完成。

CAM-31 已领取后续执行:浏览器端提供有上限的 2D column-raster 材料去除时间线、连续刀路线段 swept-envelope 碰撞分类,以及可复现的 3/4/5 轴旋转运动、限位诊断和 4/5 轴受控 G-code 输出。该实现全部标记为 nativeEquivalent:falseOpenCamLib/CAMotics、FreeCAD 原生工具轴求解、真实控制器 golden 和实体机 dry-run 仍由 CAM-31/32 负责。

202. 2026-08-07 CAD→OCL→CAMotics→G-code→LinuxCNC WASM 流水线

根据后续授权CAM 的统一执行顺序固定为:CAD/FreeCAD Path -> OpenCAMLib WASM -> CAMotics source stage -> G-code -> LinuxCNC WASM。LinuxCNC WASM 是唯一的 G-code 解析、RS274 模态、RTCP、task/motion、trajectory planner、错误诊断和机床控制器验收权威CAMotics 源码阶段只按其 GCodeMachine 运动契约生成受控 G-code不再在 CAMotics 或 Web JavaScript 中复制 G-code parser。

本轮已下载并锁定 CAMotics e84665f2fa9d1151f03282ac7e01320bc65e015bCAMotics/,校验 GCodeMachine.cppGCodeModule.cppToolSweep.cpp。随后按镜像回退策略补齐 C! 1.7.2 与 SCons构建并验证 CAMotics 1.3 headless CLI浏览器仍只执行源码运动契约不执行 ELF。OpenCAMLib WASM 锁定 95b036fe28ce6d77c97b98e5fbc337904ae49560Chrome 150 实际执行 2 个三角面/14 个刀位点并通过确定性检查OCCT 实体去除验证 stock 300、removed 12、remaining 288、结构有效单实体、BRep 导出和资源释放 0/0

FreeCAD 原生 CAM oracle 已实际运行 FreeCAD 1.1.1/Qt 6.8.2Profile 32 条命令/20 条切削命令、56 个动态 CAM 命令、Path::FeaturePath::FeaturePython 原生 save/open/mutate/save/open 通过Web Path::PropertyPath 可编辑 codec 仍保留为显式未闭合项。LinuxCNC 侧新增受控 iframe bridge父页面只能提交已经生成的 G-codeLinuxCNC 页面负责 loadProgram、解析、task/motion 和运行,返回 parserAuthority: linuxcnc-wasm;桥接静态测试已通过,端到端 machine acceptance 继续由专用 Chrome 证据门收口。

新增复跑入口:

npm run test:cam-pipeline
npm run check:cam-pipeline
npm run test:cam-native-simulation
npm run check:opencamlib-wasm
npm run test:chrome-cam-native-simulation
npm run check:chrome-cam-native-simulation
npm run test:chrome-cam-linuxcnc-machine
npm run check:chrome-cam-linuxcnc-machine

主链随后完成了强制 OCL 接管:prepareCamPipeline() 现为异步步骤,必须由锁定哈希的 OpenCAMLib WASM PathDropCutter 返回刀位;返回的刀位写回所选 Operation 后才进入 CAMotics 源码阶段并生成 LinuxCNC 程序。Node 单测只能显式注入 runner生产浏览器路径没有静默跳过 OCL 的分支。

最终 Chrome 150 机器报告为 PASS5 个 CAD 候选路径点经 OCL 解析成 48 个刀位点CAMotics 阶段后的 XYZBC 程序为 2758 字节/65 行LinuxCNC WASM 上游 RS274、task/motion 和 kinematics 先以 dry-run 接受,再以 run 接受 138 个块及 48 个轨迹段。程序包含 M428/M429G93/G94、B 轴 5→15 和 C 轴 359→361 连续跨周;此前正 Z 程序被机床 AXIS_Z [-475,0] 正确拒绝,认证工件改到合法工作空间后才通过,未绕过限位。

CAM-21..CAM-32 当前为 8 completed / 4 in_progress / 0 pending / 0 blocked。继续项是完整 FreeCAD Path 算法/全部 Qt Task 状态、FeaturePython/full operation-object Path 语义、CAMotics GUI/TPL/浏览器同输入差分、任意曲线实体扫掠与认证机型以外的连续工具轴/生产安全门;总声明仍固定为 compatible browser subset不升级为 exact FreeCAD CAM parity。

203. 2026-08-07 CAM 剩余边界收口

本轮把上一节列出的可验证子集补齐,并同步机器可读差异边界:

  • FreeCAD Qt 动态 oracle 现在实际回放 Job/Profile 的 setEdit()、Task panel 打开、OK/Cancel QDialogButtonBox 点击和关闭;每个面板观测到 14 个字段,报告为 taskLifecycleVerified=true。这关闭了 Task 生命周期子项,但完整选择、键盘、焦点、校验和全部工序面板仍是 in_progress
  • Web Facade 已提供受限 Path::PropertyPath codec。对原生 Path::Feature,可读回 .nc 资源并追加 M3 S12000FreeCAD 重开后由 5 条命令变为 6 条;资源路径、版本和 Center 元数据不可由该编辑 API 改写。Path::FeaturePython 仍是不执行代码的只读 proxy完整 operation-object 语义不宣称。
  • Chrome 150 的 OCCT 去料 harness 新增 continuous-segment-sweep-brep:对曲线路径采样段建立定向圆柱和端点球并集,库存剩余体结构有效、单实体、去料体积约 13.876647806980372,释放后 shapeCount/kernelReferenceCount=0/0。这覆盖连续采样折线段,不等于解析 NURBS/圆弧的无弦误差 sweep 或 FreeCAD exact material removal。
  • CAMotics 源代码继续锁定 e84665f2...C! 1.7.2 经镜像回退取得并以 v8_compress_pointers=0 对齐系统 V8 ABICAMotics 1.3 headless CLI 已构建。浏览器源码阶段仍只生成运动契约 G-codeCanonical G-code 的解析权唯一归 LinuxCNC WASM工作区 nativeExecutable=true 与浏览器 nativeExecutable=false 分开报告。
  • LinuxCNC 新增 web/scripts/check-production-safety-gate-matrix.mjs 和对应 Node test覆盖 XYZBC、XYZAC、XYZAB、XYZACB、XYZBCA、max5 六个配置。报告 web/evidence/production-safety-gate-matrix.json 为 PASS但所有生产门均关闭认证 XYZBC 为 closed-digital-only,其余为 closed-machine-specific-certification-requiredphysicalMotionObserved=falseproductionOpen=false。该矩阵只证明 fail-closed 源/配置边界,不是实体执行器、碰撞、计量或生产安全认证。

本轮通过的关键命令:

./npmw run probe:freecad-cam-path
./npmw run check:freecad-cam-path
./npmw run test:freecad-cam-path-report
npm run test:chrome-cam-native-simulation
npm run check:chrome-cam-native-simulation
cd cnc_wams_gpt6/linuxcnc-master/web
npm run check:production-safety-gates
npm run test:production-safety-gates

CAM-21..CAM-32 的机器状态仍为 8 completed / 4 in_progress / 0 pending / 0 blocked;总体声明保持 compatible-browser-subset-not-exact-freecad-cam-parity,未观测实体执行器认证。

204. 2026-08-07 CAMotics 原生 headless 构建与镜像回退

按“先参考中国网站失败后继续其他网站”的要求C! 依赖先尝试 gitclone.com,该入口返回 HTTP 502随后转到 ghproxy.net,完整下载上游 cbang master 归档。下载归档为 5,863,064 字节SHA-256 为 c169add088bf40c23c52952b442e39d17626084a28f41e7bba7e1c43cd30fbee,下载时远端 master 解析为 9b6672a0e2b800a909d799ffa3ab46774cf171b8。归档、C! SConstruct/CODE_TAG/LICENSE 指纹与来源全部记录在 config/camotics-native-artifact.json

C! 1.7.2 使用 strict=0 optimize=1 v8_compress_pointers=0 构建,解决系统 V8 未启用 pointer compression 与初始 embedder 配置不一致导致的启动崩溃。CAMotics 提交 e84665f2... 随后以 with_gui=0 with_tpl=0 构建 camsimgcodetoolplannerbuild/camotics.socamsim --version 返回 1.3;对 examples/slant_test/slant_test.camotics 连续运行两次,均输出 120,884 字节、2,416 三角面的合法 binary STL除 CAMotics 写入的非确定性 80 字节 STL header 外facet payload 逐字节一致,稳定 SHA-256 为 969d95c9f468e05d68b06e63f54c8fefb93e31912546751249d014df56d8fd0b

新增复跑入口:

./npmw run build:camotics-native
./npmw run check:camotics-native
./npmw run check:opencamlib-wasm
./npmw run check:cam-pipeline

这次关闭的是“CAMotics 原生程序未构建”的 headless CLI 子项,不关闭 Qt GUI、TPL、浏览器内原生运行或相同 CAD/OCL 输入的 CAMotics/OCCT/FreeCAD 全量差分。原生 camsim 仅作为离线仿真 sidecar 证据;正式顺序仍是 CAD -> OCL -> CAMotics source stage -> G-code -> LinuxCNC WASM,规范 G-code 不经过 CAMotics parser唯一解析/RTCP/task-motion/控制器权威仍是 LinuxCNC WASM。

205. 2026-08-07 CAMotics standalone WASM 内核

根据后续要求,已将 CAMotics 上游扫掠实现编译为独立 WebAssembly 内核。native/camotics-wasm/build.sh 使用 Emscripten 3.1.69、C++17、-O3 -fltoSTANDALONE_WASM=1,直接编译锁定 CAMotics 提交中的 Sweep.cppConicSweep.cppSpheroidSweep.cpp;未复制公式到 TypeScript。轻量 include overlay 只提供这些上游源文件所需的几何类型和日志/Move 前置声明,不修改 CAMotics 源码。

制品为 public/vendor/camotics/camotics-sweep.wasm,大小 11932 字节SHA-256 为 889588d2dc9755f84f56b8ebe1acc9bc1f0ded7e676e162a5a001011f4ebec5b,零 imports导出 ABI、Conic depth、Spheroid depth 和 sweep 包围盒计数。Node 结构门禁与 Chrome 150 实际加载均通过Conic inside 1、outside -1、Spheroid inside 1、长段包围盒 3,重复执行确定性一致。

浏览器加载器 src/facade/camoticsWasm.ts 在实例化前验证响应 SHA-256、WASM imports 和 ABIChrome harness 报告 backend: camotics-upstream-sweep-wasmbrowserExecutable=true 仅表示该扫掠内核可执行,fullCamoticsProgram=falsegcodeParserIncluded=false。完整 CAMotics Qt/TPL/文件系统/camsim 程序仍未进入浏览器LinuxCNC WASM 仍是唯一规范 G-code parser/controller authority。

复跑命令:

./npmw run build:camotics-wasm
./npmw run check:camotics-wasm
./npmw run test:camotics-wasm
./npmw run test:chrome-camotics-wasm
./npmw run check:chrome-camotics-wasm

206. 2026-08-07 CAMotics native target set and evidence reconciliation

standalone sweep WASM 完成后,补齐了宿主侧 CAMotics 目标集合:固定 CAMotics e84665f2...、C! 9b6672a0...、C++17 和 v8_compress_pointers=0,当前工作区同时保留 Qt5 camotics、TPL tplang、headless camsimgcodetoolplanner 以及 build/camotics.so。Qt/TPL 原生制品通过 --help、官方 TPL 10 passed / 0 failed 和 Xvfb 1200x800 可见窗口冒烟CLI 通过 --helpOpenCAMLib 门禁也确认这些 sidecar 存在。

证据文件现在把三类运行边界分开记录:宿主原生 CAMotics 程序可用;浏览器只加载 public/vendor/camotics/camotics-sweep.wasm 的上游 Conic/Spheroid sweep 子集LinuxCNC WASM 仍是规范 G-code 的唯一 parser/controller。浏览器报告中的 browserExecutable=true 仅指该零 imports sweep kernel 可执行,fullCamoticsProgram=falsegcodeParserIncluded=false 不变。

本轮最终门禁:

check:camotics-gui-tpl       PASS
check:camotics-native        PASS
check:opencamlib-wasm        PASS
check:camotics-wasm          PASS
test:camotics-wasm           3/3 PASS
check:chrome-camotics-wasm   PASS (Chrome 150, deterministic)
check:freecad-cam-path       PASS (Profile/Helix oracle subset)
test:freecad-cam-path-report 7/7 PASS

FreeCAD CAM 仍保持 compatible-browser-subset-not-exact-freecad-cam-parity;完整浏览器 CAMotics 程序、同输入 simulator differential、全量 FreeCAD Path/Task 语义和 FeaturePython operation-object 往返仍是未关闭差异。LinuxCNC 生产安全矩阵继续 PASS 但所有实体生产门保持关闭;当前未观测实体运动,也没有实体机或计量认证声明。

207. 2026-08-07 发布签名门恢复

此前全量 verify 的唯一阻塞是变更后的 dist/ 与旧发布清单不一致,而环境没有 RELEASE_SIGNING_PRIVATE_KEY/RELEASE_SIGNING_KEY_ID。现已建立受控 Ed25519 签名入口:.secrets/release-signing-private.pem 仅本机保存且权限固定为 600.gitignore 排除整个 .secrets/,仓库只保留对应公钥;scripts/release-signing-key.mjs 在生成前检查密钥类型、权限和公钥匹配,scripts/sign-release-artifacts.mjs 统一注入签名环境并调用清单生成器。

generate:release-artifacts 已切换到该入口,check:release-signing-keycheck:release-artifactscheck:release-closuretest:release-signature 均以同一 Ed25519 公钥复核。发布清单已重新生成;私钥内容不写入 Git、日志、dist/ 或文档。SBOM 闭环不再硬编码旧的 172而是与锁定审计清单的当前组件总数一致当前为 173避免下次依赖锁定变更再次制造伪阻塞。

208. 2026-08-07 FeaturePython Path 资源级编辑

在不放宽 Python 执行边界的前提下FCStd Facade 新增 FcstdPathAccessOptions.allowFeaturePythonFcstdPathEdit.allowFeaturePython。默认仍拒绝 Path::FeaturePython,只有调用方明确 opt-in 才能编辑已有 Path::PropertyPath 指向的 .nc 资源;重写过程保留 Document.xml、GuiDocument、脚本、未知条目、资源路径、版本和 Center 元数据,并且只重新压缩原生路径文本。

FreeCAD 1.1.1/Qt 6.8.2 oracle 已验证 PythonPath 由 Web 追加 M2 后从 5 条命令重开为 6 条,scriptExecution=blockedNode 报告扩展到 8/8check:freecad-cam-path 通过。该增量关闭了 FeaturePython 路径资源的安全编辑缺口,但没有宣称 Python-backed 属性、重算、完整 operation-object 或全部 Path 算法 exact parity。

209. 2026-08-07 CAM Job 元数据命令闭环

CAM_CommentCAM_PropertyBagCAM_Compound 不再停留在兼容提示Job 现在持久化评论、字符串/数字/布尔属性以及由至少两个现有 Operation 组成的复合组。三类对象共用同一 CamSnapshot,因此参与版本化 Job JSON、导入校验、OPFS 资源保存和 Undo/Redo删除 Operation 会自动移除无效复合组。属性名、值长度、集合数量、重复引用和有限数值均有边界校验,旧版没有 metadata 字段的 Job 会恢复为空元数据。

CAM Task Panel 已提供对应输入控件Chrome 150 证据新增类型保持、Job 字节级重开、依赖清理和撤销恢复检查;test:cam 13/13、test:chrome-camcheck:chrome-cam 均需通过。该闭环只关闭 CAM Job 元数据语义,不等同于 FreeCAD 原生 Path operation-object、Python recompute 或完整 Qt Task 校验。

210. 2026-08-07 3D 面拾取与稳定 TopoRef 预选

Three.js Viewport Adapter 现在保留 Bitbybit 网格中每个面对应的三角形范围,射线命中后把三角形索引映射为稳定 persistentId,再通过 Facade selection.selectSubshape()/preselectSubshape() 更新文档选择状态。悬停面使用独立半透明高亮网格;离开、换面、换 Shape 和销毁适配器时会释放几何与材质,避免长会话积累 GPU 资源。

Node 测试覆盖两面/三三角形的范围映射和越界拒绝;test:facade 为 168/168生产构建通过。Chrome 150 应用回放通过,工作区 canvas 仍由 Bitbybit OCCT 提供且无页面错误。当前完成的是可见面的拾取、预选和高亮链路;边/点拾取、多对象同时渲染、框选和诊断候选的主动 3D 闪烁仍需后续补齐,因此 TSN-09 保持 IN PROGRESS

211. 2026-08-08 3D 边/顶点拾取与诊断聚焦闪烁

MeshAsset 现随面三角形范围一起携带网格派生的稳定边线段和顶点坐标Three.js 适配器在实际 Shape 射线命中后,以 CSS 像素容差优先判定顶点、其次边、最后面,并将三种结果统一回调 Facade 的 selectSubshape()/preselectSubshape()。边使用独立 Line 高亮,顶点使用屏幕尺寸稳定的 Points 高亮,换 Shape、离开和销毁时均释放 GPU 资源。

诊断树的 select-object 修复动作新增显式 diagnostic.focused 事件。React 只投影该事件Viewport Adapter 在选中对象上执行 1.4 秒、三周期的发光脉冲普通通知文本不再承担控制协议。Facade 回归测试同时验证事件带回原 diagnosticId 和目标 objectId。

生产构建与 test:facade 168/168 通过。当前边/顶点来源仍是网格签名回退:当浏览器内核未返回可映射的 BRep 曲线参数时,内部三角剖分边不能宣称等同于 FreeCAD/OCCT 原生边,因此能力保持 experimental

Facade 选择边界进一步增加了有序、去重的 selectedObjectIds/selectObjects(),保留 selectedObjectId 作为主对象兼容投影;模型树的 Shift/Ctrl/Command 点击可增删选择删除、建新文档、加载文档和子形状选择会同步修正选择集合。Viewport Adapter 增加修饰键拖框、可见框和 onBoxSelect 回调,拖框结束后的 click 会被抑制,避免父级清空选择。当前工作区仍只注册一个可见 Mesh因此这个切片只完成选择集合和框选手势协议不能宣称完成跨多个可见对象的空间筛选下一步仍需对象到 Mesh 注册表、投影包围盒/穿越框判定及多对象高亮。

212. 2026-08-08 多对象 3D 场景与真实框选

上一节保留的单 Mesh 边界已经关闭。Viewport Adapter 新增带 objectIdsetMeshes() 场景注册表,同时保留 setMesh() 兼容入口;射线命中、面/边/点拾取、预选、高亮和诊断闪烁现在都从命中的 Mesh 返回真实对象 ID。选择材质按完整 selectedObjectIds 集合投影,不再只高亮主对象;fitAll() 和 CAM 路径映射也改为面向场景对象集合。

工作区按文档 Visibility 和 Part Design Body Tip 收集几何缓存:独立 Part Shape 可同时显示Body 默认只显示 Tip。模型树上下文菜单和 Space 键现会实际切换 View 属性而不是只显示提示。空白左键拖动可替换选择Shift/Ctrl/Command 拖动可增量选择;从左向右使用完全包含的 window 规则,从右向左使用包围盒相交的 crossing 规则。投影筛选不依赖遮挡,因此可选择矩形内被其他实体遮住的文档对象。

Facade 测试增至 169/169新增 window/crossing 边界用例。Chrome 150 生产包回放实际创建 BoxCylinderCanvas 报告两个 Mesh右向左穿越框返回 box,cylinder模型树同步选中两项WebGL error 为 0、页面错误为 0。该里程碑关闭多对象同时渲染和真实空间框选缺口仍未关闭的是网格三角剖分边与 OCCT 原生 BRep 曲线/拓扑历史之间的精确语义差异。

213. 2026-08-08 OCCT BRep 边/顶点拾取接线

上一节剩余的三角剖分边误选问题已从正常运行路径移除。geometry.mesh() 现在并行读取 Bitbybit shapeToMeshplugins.topology.describe:面三角范围使用 analytic Surface TopoRef每条 edgeList OCCT Edge 的完整折线采样共享同一个 analytic Curve TopoRef顶点坐标直接取 BRepGraph vertex 描述。曲线悬停会高亮该 persistentId 的全部线段,不再只显示第一段;只有 topology 插件不可用或数组不一致时才显式回退旧的 tessellation 签名。

新增 Facade 负例用两个三角形组成的四边形,确认内部对角线不会进入 OCCT Edge 拾取载荷;测试总数为 170/170。Chrome 150 对实际 Box + Cylinder 报告 topologySource=occt-analytic,三类来源均为 analytic合计 15 条 Edge、10 个 Vertex双对象穿越框和原有完整应用流程继续通过。

该增量对齐的是“拾取几何与当前对象拓扑快照使用同一组 OCCT analytic TopoRef”不是完整 FreeCAD 拓扑命名宣称。跨 Boolean/特征的 Generated/Modified/Deleted 原生历史、同构子形的歧义消解和所有 FreeCAD ElementMap 命名规则仍属于 TSN 后续任务。

214. 2026-08-08 跨特征原生历史、邻接消歧与 ElementMap 命名

本轮将已有独立 OCCT history Worker 接入重算器的普通单向特征分支Part/PartDesign Pad、有限长度 Pocket、单角 Revolution 和单角 Groove 现在在输入 Shape、方向、轴和角度满足约束时调用 topologyHistory(),并把返回的 Modified/Generated/Deleted 按源对象、源 kind、结果 kind 和稳定 TopoRef 写入对象历史Through-all、双向、Two angles、Up-to-face、带锥度或输入 Shape 不可用的模式继续安全回退签名历史不把近似结果伪称原生历史。Facade 回归新增重算级断言,验证四种 operation 路由均实际发生。

拓扑迁移新增邻接指纹消歧:重复 analytic 签名只有在邻接目标签名形成唯一一对一指纹时才继承原 persistent ID完全对称或邻接损坏仍返回 ambiguous,保留候选并阻止静默错绑。该策略覆盖面、边和顶点的邻接关系,不依赖 transient OCCT index。

对象拓扑快照新增 schema v1 ElementMap:按 FreeCAD FaceNEdgeNVertexN 规则分配名称Preserved/Modified 关系继承源名称Generated 分配未占用的新名称Deleted 与 ambiguous 保留状态和候选来源。Project persistence 会复制并校验名称、唯一性和 transient IDFCStd Shape 属性未显式提供原生映射时自动写出当前 live ElementMap显式 ElementMap 仍优先保留。新增回归后 Facade 测试为 174/174。

本轮关闭的是“已有原生 provider 能力未接入普通跨特征重算”和“Web 拓扑没有可持久化 FreeCAD 名称”的缺口;仍不宣称所有复合/多阶段 PartDesign 特征、跨 Boolean 一对多 lineage、完整 FreeCAD ElementMap2 历史 token 迁移及所有对称模型都达到 exact parity。任何无法由原生关系或唯一邻接指纹证明的情况继续显示为 fallback/ambiguous。

215. 2026-08-08 ElementMap2 原生协议与 30 模型阶段门

采集器还覆盖局部 Fillet/Chamfer并在关闭/重开每个 FCStd 后比较 mapped names该结果直接计入 roundtripNameDrift,不是只对同一进程内的对象快照做比较。

本轮把 FreeCAD 1.1.1 的原生 ElementMap 文本格式落实为 src/facade/elementMap2.ts:解析 PostfixCount/MapCount/ElementMap/ChildCount/NameCount、索引 token、命名 token、子 map 和 string-id并提供 schema v1→v2 迁移、克隆和 canonical writer。FCStd inspection 使用同一 parser 校验资源Facade 暴露 serializeElementMap2Resource();旧的摘要字段保持兼容。解析器拒绝越界计数、非法 hex、前向子 map 引用和截断资源,同时兼容历史 WebCAD 的零 type-count fixture。

ElementMap2 writer 现在先执行结构校验,再按 map index 和 section 数量规范化输出;validateElementMap2() 检查 root map、child map 图、type count 和 token 结构,elementMap2SemanticDigest() 对 postfix、child/string-id 和原始命名 token 生成稳定摘要。两个 FreeCAD 阶段门都会比较摘要而不是只比较计数,因此命名 token、来源图或 schema 迁移发生语义漂移会直接失败。

原生历史协议保留 v1 请求号以兼容现有 Worker新增有序 inputsstagesresultStepByStage transport记录支持任意 inputId、source/result stage、单个或多个 result index。Facade NativeTopologyHistoryRecord 和持久化关系保留这些 stage 字段,删除记录仍兼容旧 provider 发出的 resultIndex=-1;同一来源的多个 OCCT 结果现在会归并为一个 resultIndexes 关系。新增 captureNativeTopologyHistoryStages(),按产生结果的 stage 解释索引、校验 stage DAG并在重复签名存在邻接唯一指纹时消歧否则保留 ambiguous 候选;composeNativeTopologyHistoryLineage() 会把上游对象的 native stages 去重并接到下游来源关系,使 Pad→Pocket、Boolean→Dress-up 等历史不再分裂成孤立片段。重算提交为每个已接入 operation 写入显式 stage 描述,并把 stage 输入/STEP 元数据送入 native coordinatorUp-to-face、双向、Midplane、Two angles 的几何语义继续由已有多 Shape/顺序 Cut/Revolution 分支执行native history 在 provider 不能证明阶段几何时保持 fallback不伪报 exact。

新增 FreeCADCmd 真实采集器 scripts/freecad-composite-history-elementmap-oracle.py 及 runner建立 30 个独立 Boolean、PartDesign 和复合特征模型;每个 case 保存 FCStd采集阶段 getElementHistory()getElementMappedName()、Shape 质量、ElementMapVersion/Size 和压缩包内原始 *.Map.txt(当前 30/30 case、91 个资源)。check-freecad-composite-history-elementmap-oracle 重新解析并写回全部资源;check-freecad-exact-history-elementmap-gate 联合 30-case 报告和现有 FreeCAD roundtrip 证据,计算 wrongBindings=0unexplainedRelations=0roundtripNameDrift=0elementMap2ParseFailures=0elementMap2SemanticFailures=0

本轮关闭了“没有真实 30 模型基线”“ElementMap2 只能摘要读取”“native history 无法表达多输入/一对多/多阶段”的工程缺口,并把 stage/语义摘要接入运行时和阶段门;当时仍未宣称完整 FreeCAD 等同的是 provider 返回最终结果而非每个中间 stage Shape 时的全部跨特征 Generated/Modified/Deleted 计算、没有唯一邻接证据时的同构子形最终消歧,以及由 FreeCAD 内部算法生成而非原样转运的完整 ElementMap2 命名历史规则。上述前两项工程接线由下一节继续闭合,无法证明的 provider/算法仍不得据最终几何提升为 exact

216. 2026-08-08 复合 builder 逐阶段证据与 ElementMap2 token 生成

复合历史不再依赖 provider 的最终 Shape 猜测中间过程。NativeTopologyHistoryRecords 现在可携带不可枚举的 stageCaptures,每项包含实际 stage operation、输入/结果对象、ordinal、由该 stage resultStep 重新导入得到的完整 SubshapeTopology,以及只按该结果索引空间解释的原生记录。重算器把这些证据逐项交给 captureNativeTopologyHistoryStages(),内部工具 Shape 通过 sourceStageId/resultStageId 接到最终 Cut/Pattern不再把中间索引误套到最终 Shape。

当前已接入的真实复合路径包括Pocket 的 Pad tool -> Cut、Groove 的 Revolution tool -> Cut、Hole 的 Cylinder tool -> Cut,以及有序 MultiTransform 的组件 stage。每个 stage 都单独通过 native Worker 返回 STEP/history再由 Geometry Worker 导入、取拓扑并释放。Chrome 150 回放对 Pocket、Groove、Hole 和 MultiTransform 强制检查两阶段 DAG、非空中间拓扑、记录来源 stage、最终结果质量以及 ShapeHandle/kernel reference 0/0因此这些路径不再落入“provider 只返回最终 Shape”的旧边界。旧 provider 若不声明组成 operation仍走兼容的单响应路径且不会获得逐阶段 exact 证据。

elementMap2.ts 新增 FreeCAD 1.1.1 ElementMap::save() 的 token 生成端:从显式 MappedNameRef 证据生成 :<type-postfix>.<element-index>$<StringID-name>;<literal-name>,按一基 postfix 表和十六进制 element/postfix/StringID 写出;同时修正 child StringID 的原生 0.<decimal-id> 兼容规则。文档级 append API 会保持已有 postfix index 不变,按 section/indexed type、mapped postfix 的类别顺序追加缺项并写入新 name entry。生成器要求调用者提供 mapped postfix、marked StringIDs、prefix StringID 或 IndexedName拒绝从最终几何杜撰。反向证据解码会把已持久化 token 恢复为同一输入,再经生成器重建。

Web ElementMap 的名称继承也会按 sourceStageId/resultStageId 递归展开内部工具对象,并带环检测回溯到原始 Base/Profile测试锁定 Profile -> tool -> final 后仍继承外部来源名称,而不会把临时 stage object 当成永久命名根。

30 模型、91 个真实 ElementMap2 资源的 exact gate 新增 elementMap2TokenWriterFailures=0:每个 FreeCAD token 都必须先解为命名证据,再由新 writer 生成完全相同的 raw token原有 wrongBindings=0unexplainedRelations=0roundtripNameDrift=0、parse/semantic failure 均继续为 0。由此关闭的是“Web writer 无法产生新 token”和“已有 token 只能原样搬运”的缺口,不是允许凭最终几何逆推出 FreeCAD 私有命名决策。任意尚未接线的复合 feature 或未提供 MappedNameRef/StringHasher 证据的私有算法仍必须标为 compatible/fallback系统级 FreeCAD exact 仍受同构子形无唯一原生证据及未逐项纳入黄金模型的工作台算法约束。

验证结果Facade 178/178、Pocket/Groove/Hole/MultiTransform 四个 Chrome staged-history 回放与静态检查、OCCT history smoke、30 模型/91 资源两级门、TypeScript/Vite 生产构建及 git diff --check 全部通过;四个 Chrome 回放结束后 ShapeHandle/kernel reference 均为 0/0

217. 2026-08-09 双侧与目标面特征的原生 history 接线

NativeTopologyHistoryInput 新增有序 featureSides,每侧保存实际方向向量以及 Revolution/Groove 所需角度。重算器不再把属性面板中的原始 Length/Angle 直接当作原生 history 参数Reversed 会进入向量符号Up-to-face 会重新解析稳定面 TopoRef 并写入实际目标距离Two sides 使用 Length/Length2Midplane 拆成等长正反侧Two angles 使用各自角度和相反轴。Part 双向 Extrusion/对称 Revolution 也复用同一协议。历史协调器在所有 operation 入口统一登记文档版本,修复 Pad 逐阶段请求可能被误判为 stale 的旧缺口。

GeometryRuntime 对双侧加性特征执行 builder + builder + Fuse,对双侧减性特征执行 builder + builder + Fuse tool + Cut;每一级都通过原生 Worker 返回独立 STEP、完整 topology 和 Generated/Modified/Deleted再以非枚举 stageCaptures 交给 ElementMap lineage。Pocket 实几何同步改为先融合正反刀具、再单次 Cut消除了顺序 Cut 在共同分界面产生结构无效 Shape 的问题;相邻加性实体融合保留分界边,以通过 OCCT 结构检查。

新增 Facade 回归锁定 Up-to-face 7 mm、Pad Two sides +6/-2、Revolution Midplane 90/90 和 Groove Two angles 120/60 的有效 sweep并验证 3-stage 加性与 4-stage 减性 DAG测试总数为 180/180。Chrome 150 的 Pocket 门新增真实 Pad + Pad + Fuse + Cut:四级 topology 分别为 26/26/42/66 项,最终 20 条关系、结构有效、单 solid、释放后 0/0Revolution 门新增真实 Revolution + Revolution + Fuse:三级 topology 为 26/26/42 项,最终 90 条关系、结构有效、单 solid、释放后 0/0

本节关闭的是 Up-to-face/双侧/Midplane/Two angles 不进入 native history 参数协议的缺口,以及 Pocket 双侧顺序 Cut 的结构问题。本节结束时 Groove 双角仍采用双 builder/Fuse 路径,在具有共面分界的黄金截面上报告结构无效;下一节根据 FreeCAD 1.1.1 源码确认的“轮廓预旋转 + 单次总角度 sweep”语义替换该路径并建立通过型 Chrome 门。未提供 MappedNameRef/StringHasher、同构消歧或工作台私有 builder 证据的算法继续保持 compatible/fallback不能由最终几何推导为系统级 exact。

218. 2026-08-09 Groove 双角单 sweep 与 StringHasher 证据闭环

FreeCAD 1.1.1 FeatureGroove.cpp/FeatureRevolution.cpp 的 TwoAngles 实际语义已按源码落实:总 sweep 为 Angle + Angle2profile 先绕同一轴旋转 -Angle2,随后只创建一个 Revolution builderGroove 再以该单一刀具执行一次 Cut。native history provider 新增 rotate operation并按 rotate -> revolution -> cut 返回每一级 Shape/history。GeometryRuntime 直接导入 native provider 返回的最终 BREP同时保存 BRepCheck_Analyzer summary不再用两个共面刀具的 Fuse 猜测 FreeCAD 结果。

Chrome 150 的 Revolution/Groove 门现分别锁定 120/60 双角:两者均要求 native isValid=true、单 solid、实际 stage 顺序和释放后 0/0Groove 体积为 800 - 3π = 790.5752220392302。浏览器 BRepGraph 仍列出 STEP/BREP 恢复后“CoEdgeDef has no Curve2D representation”的已知诊断因为该实现允许平面 pcurve 按需推导、其 validator 却要求显式存储;门禁保留全部 graphStructuralIssues,只把这一精确已解释类型排除出 unexplainedStructuralErrors,其值必须为 0。OCCT 原生有效性不再被该传输层诊断误判,其他结构错误仍会阻断门禁。

新增 src/facade/stringHasher.ts,逐项实现 FreeCAD 1.1.1 StringHasher.Table.txt v1 codec十六进制/相对 StringID、related-ID 差分、flags、Postfixed/PostfixEncoded/Indexed/PrefixID、TextOutputStream 多行负载,以及 schema v1→v2 迁移、克隆和校验。writer 已用仓库内真实 PartDesignExampleEngineBlockBIMExample 共 1638 个 StringID 校准为逐字节相同写回。FCStd inspection 现在返回结构化 StringHasher document/validation把 ElementMap2 的 child IDs、suffix IDs 和 $#id:index prefix ID 全部闭合到同一表悬空证据直接拒绝。writer 可接受结构化 stringHasherTable,并禁止与 opaque 表同时提供。

30 模型 oracle 现在同时采集 FCStd 中的 StringHasher.Table.txt30/30 case 中 11 个含真实表,连同 91 个 ElementMap2 资源进入 exact gate。新增 stringHasherParseFailures=0stringHasherSemanticFailures=0stringHasherEvidenceFailures=0,原有错误绑定、未解释关系、名称漂移和 ElementMap2 三项失败计数继续为 0Facade 回归为 182/182

本节关闭的是 Groove TwoAngles 当前黄金截面的原生结构有效性以及“StringHasher 只能作为不透明附件、不能解析/迁移/写回/核对引用”的缺口。仍保留的准确边界是WebCAD 只能从实际 MappedNameRef/StringHasher 表或逐阶段原生 builder 证据生成相同 token不能从最终几何发明 FreeCAD 私有算法尚未提供的新 StringID、哈希或命名决策无证据时必须保持 compatible/fallback。系统级 exact 仍要求其余工作台算法逐项纳入原生黄金模型,并要求同构子形具有唯一原生来源证据。

219. 2026-08-09 运行时命名证据、跨阶段 ElementMap2 与能力等级阶段门

新增 src/facade/nativeNamingEvidence.ts 作为运行时证据合同:NativeMappedNameRef 保存结果 kind/index/persistentId、FreeCAD MappedNameRef token 输入、关系、跨对象来源和同构候选;NativeStageNamingEvidence 同时保存可选的结构化 StringHasher 表、ElementMap2 文档和五态状态(native-evidenceopaque-preservedfinal-shape-onlyambiguousmissing)。验证器会检查 StringID 是否存在于同一张表、映射是否重复、来源是否完整、歧义是否至少保留两个候选,并拒绝在 final-shape-only 阶段附加伪造 token。

native history stage capture 现在携带该证据。GeometryRuntime 对 provider 返回的实际命名证据做 stage/result 绑定校验provider 只返回最终 Shape 时明确写入 final-shape-onlyPocket/Groove/Hole/有序 MultiTransform 等手工复合数组也统一写入同一边界。重算历史保留 namingEvidenceElementMap snapshot 在有证据时深拷贝保存,缺证据不会被升级为 exact。

elementMap2.ts 新增跨阶段映射对象和 JSON parser/writer每个 stage 保存输入 stage、结果对象、原生 token、来源引用和 stable/ambiguous/generated/deleted 状态。ambiguous 记录候选集合并通过写回验证;同构子形没有唯一来源时不会按数组顺序猜测。新增 30-case 黄金采集字段 namingEvidenceStatus219 个阶段均显式标为 final-shape-only 或含原始 StringHasher 时的 opaque-preserved,无缺失和越界。

config/compatibility-matrix.json 现在按 feature 登记能力等级Pad/Pocket/Revolution/Groove/Boolean 为 compatible 子集Fillet/Chamfer/MultiTransform 仍为 experimental;每项都列出 exact 阻断条件。systemExactEvaluation.exact=false 且阻断条件固定为“FreeCAD 私有 token 算法、缺少原生 builder stage、无唯一同构来源”。npm run verify 新增 check:freecad-native-naming-evidence,并把黄金模型的命名证据缺失/边界违规计数接入 ElementMap2 exact gate。

本节完成的是证据建模、stage 挂接、多阶段名称映射、歧义持久化和逐 feature 能力分级;不是从几何推导私有 StringHasher/MappedNameRef。系统级 FreeCAD exact 仍保持关闭,直到每个 feature 都有逐阶段原生 Shape/history 与原生命名证据。

220. 2026-08-09 FreeCAD Web exact 全范围任务与机器门禁

新增 config/freecad-web-exact-parity-plan.json,把原 P01..P10 已完成的浏览器 compatible 发布范围与新的系统 exact 工作分开。新计划固定 10 个 program、52 项任务,覆盖锁定源码清册的 34 个模块、入口清册的 15 种格式和 6 类入口;每项记录优先级、依赖、交付、验收、当前可执行证据和 exact 阻断原因。当前状态为 1 completed / 37 in_progress / 14 pending / 0 blocked,唯一完成项是 EX-TSN-00 无证据 fail-closed这避免把已存在的兼容子集或静态 UI 清册误报为完整 FreeCAD。

新增 scripts/check-freecad-web-exact-parity-plan.mjs,校验 EX01..EX10、任务 ID/依赖无环、证据脚本存在、所有开放任务都有阻断原因、模块/格式/入口与锁定 inventory 完全一致、三项命名边界仍存在,以及 EX-REL-01 在上游未完成时不得关闭。check:execution-plan 现在同时执行旧 P01..P10 发布计划和新 exact 计划,因此默认 npm run verify 会阻断漏项、陈旧任务计数、proxy 模块被静默删除或系统提前提升 exact。

新增 scripts/check-freecad-web-exact-promotion.mjs 作为第二道 promotion gate当前 claim.exact=false 时只允许输出 freecad-web-exact-promotion-fail-closed;任何未来将 claim 改为 true 的提交都必须同时提供 config/freecad-web-exact-promotion-report.json,由 EX-REL-01 确认 52/52 任务、34/34 exact 模块、八项零差异指标和八类证据,否则默认 verify 失败。当前门禁实测为 EX-REL-01=pendingcompletedTasks=1/52exactModules=0/34

221. 2026-08-09 EX-REL-01 promotion 实施手册与报告契约

新增 docs/freecad-exact-promotion-runbook.zh-CN.md,把 52 项 exact 任务拆为七个连续实施阶段:基线/oracle、kernel/history/naming、App/特征内核、FCStd/格式、GUI/工作台、FEM/CAM/平台、QA/promotion。每个阶段列出任务 ID、执行命令、交付物、退出条件和失败回退任何阶段失败都保持当前能力等级不得从最终几何补推原生语义。

新增 config/freecad-web-exact-promotion-report.schema.json,固定 EX-REL-01 报告必须包含 52/52、34/34、八项零指标和八类证据。当前不生成该报告在所有上游任务完成前check:freecad-web-exact-promotion 必须继续输出 freecad-web-exact-promotion-fail-closed

222. 2026-08-09 EX-ORA-01 桌面 oracle 与 inventory 对账

新增 scripts/check-freecad-oracle-coverage.mjs 并接入 check:execution-plan。它读取锁定的 .cache/freecad/reference-desktop.json,逐项核对 34 个模块、1113 个 GUI command、source-only command 原因和 TypeId/property inventory当前真实结果为 compiled-importable=30not-built=4runtimeObjectCount=7staticObjectCandidateCount=1673GUI command ID 与观察记录全部对齐。

这关闭了 EX-ORA-01 的“清册与桌面报告未机器对账”子项,但不关闭完整 oracle4 个未构建模块仍需 build/proxy 决策1673 个静态对象候选仍需逐对象 runtime probe。EX-ORA-01 继续保持 in_progresssystemExact=falsepromotion gate 不受影响。

config/compatibility-matrix.jsonsystemExactEvaluation 已指向该计划并登记 promotion task 和任务计数。最终提升条件固定为 52/52 completed、34/34 exact同时 wrongBindings/unexplainedRelations/roundtripNameDrift/unknownSemanticDifferences/namingEvidenceMissing/namingEvidenceBoundaryViolations/unexplainedModules/releaseBlockers 全部为零。没有原生 MappedNameRef/StringHasher、逐阶段 builder 或唯一同构来源时仍不可从最终几何补推。

223. 2026-08-09 EX-ORA-02 黄金模型覆盖矩阵门禁

新增 config/freecad-golden-coverage-plan.jsonscripts/check-freecad-golden-coverage.mjs。该门禁把 35 个 Part/PartDesign feature family 拆成七个独立维度:成功夹具、失败夹具、原生 history、复合阶段、ElementMap2 资源、FCStd 往返和浏览器回放。它同时核对固定的 FreeCAD 1.1.1 提交、100/51 个主成功/失败夹具、5/5 个 supplemental feature-family 成功/失败夹具、30 个复合 case、219 个阶段、91 个 ElementMap2 资源、11 个 StringHasher 资源、22 个 FCStd 往返场景和 100 个浏览器黄金报告。

当前报告为 freecad-golden-coverage-pass,但仅表示清单和已有证据结构一致,不表示 exact 完成105/56 个文件夹具与额外原生 oracle 共提供 27 项成功、23 项真实 rejected 失败证据35 个 family 均满足当前定义的适用维度。复合阶段已更新为 native-evidence=219/219,其中只有 74/219 阶段的全部子形具有 MappedName 私有 token 证据42 个操作阶段仍无中间 builder 证据35/35 仅代表每族基础边界覆盖,不代表参数 mutation 穷举、逐阶段 builder 或命名 exact。使用 ./npmw run check:freecad-golden-coverage -- --details 可查看逐 family blockers 和全局 blockers。该门禁已接入 check:execution-plan/默认 verify

复跑命令:

./npmw run check:freecad-golden-coverage
./npmw run check:freecad-golden-coverage -- --details
./npmw run test:golden:freecad:families -- --json
./npmw run test:golden:freecad:family-failures
./npmw run check:freecad-partdesign-failures
./npmw run check:freecad-partdesign-revolution-groove
./npmw run check:freecad-partdesign-transform
./npmw run check:freecad-part-builders
./npmw run check:execution-plan

EX-ORA-02 继续保持 in_progress;在覆盖矩阵和逐阶段原生证据闭合前,claim.exactsystemExact 均保持 false

224. 2026-08-10 PartDesign 失败语义与 Revolution/Groove 原生成功证据

新增 freecad-partdesign-failure-oracle,以锁定的桌面 FreeCAD 1.1.1 运行 17 个 PartDesign TypeId 的缺输入边界。13 项返回原生 rejected 诊断Mirrored、MultiTransform、LinearPattern、PolarPattern 在无 Originals 时保持 Up-to-date + Valid + null Shape,被明确分类为 4 项 accepted-empty不再用“创建成功但为空”伪装失败覆盖。checker 同时拒绝把模块缺失或未知 TypeId 当作 feature 失败。

新增 Revolution/Groove 原生成功 oracle实际创建 profile、重算并校验有效单 Solid两项分别得到体积 75.39822368615502995.2876110196153。两道 checker 已进入默认 check:freecad-sketcher-constraints并由质量闭环再次核对EX-ORA-02 的结构化证据列表也已登记。

本增量把 family 覆盖推进到 25/35,没有改变系统声明。后续补齐为 35/35 基础成功/失败边界,但参数 mutation 仍由独立矩阵 fail-closed无原生 MappedNameRef/StringHasher、逐阶段 builder 或唯一同构来源时,仍禁止从最终几何生成私有 token 或中间历史。

225. 2026-08-10 Part 高级 builder 与 PartDesign 变换边界闭合

新增 freecad-part-builders-oracle,直接创建并重算 Part::Extrusion/Revolution/Loft/Sweep/Fillet/Chamfer 文档 feature。6/6 成功案例均为有效单 Solid6/6 缺输入案例均进入原生 Invalid/null Shape并锁定 No object linkedNo sections linked. 诊断。Fillet/Chamfer 按 1.1.1 FilletBase 源码使用单对象 Base(edgeId,r1,r2) Edges保留 FreeCAD 输出的 Compound 顶层容器与单 Solid 子结构。

PartDesign transform oracle 由 4 项扩为 10 项:补入 PolarPattern 4000 和 Mirrored→LinearPattern→PolarPattern MultiTransform 20000 的原生有效单 Solid另以有效 Originals 加缺失 plane/axis 或越界 Edge999 采集四项真实 rejected。MultiTransform 在子变换失败时保留旧的非空 Shape同时状态为 Touched + Invalid 并报告 Shape index 999 out of bound 12;门禁把它锁定为 stale-shape-on-failure不能按 Shape 非空误判成功。

当前 35/35 Part/PartDesign family 均有基础成功与真实失败边界,新增 oracle checker 已进入默认验证链,覆盖门禁记录 27 项原生成功和 23 项原生失败证据。EX-ORA-02 仍为 in_progress:参数 mutation 尚非穷举219/219 阶段的运行时索引证据也不等于中间 builder 或私有 token exact。因此 systemExact=falseEX-REL-01=pending1/52 completed0/34 exact 均不变。

226. 2026-08-10 原生阶段命名证据与参数 mutation fail-closed 矩阵

复合历史采集器已改为直接调用 FreeCAD 1.1.1 运行时 API对每个 Face/Edge/Vertex 读取 getElementMappedName(name, true)getElementIndexedName(name, true)、返回的 StringID 和 getElementHistory(),并将结果绑定到 stageId/resultObjectId。30/30 模型的 219/219 阶段现在均为 native-evidencecheck:freecad-composite-history-elementmapcheck:freecad-native-naming-evidence 都会逐阶段验证 identity、索引唯一性、引用格式和来源链。

该状态只证明 FreeCAD 运行时确实返回了当前结果的 MappedName/IndexedName 证据。219 个阶段都有 IndexedName其中 74 个阶段的所有子形同时具有 MappedName另 145 个阶段只能保留原生索引身份,不能把 FaceN/EdgeN/VertexN 提升为私有 token。采集器明确保留 internalBuilderEvidence=false,目前 42 个 Part/PartDesign 操作阶段仍没有逐个中间 OCCT builder 的 Shape/history 证据;这些阶段不能从最终 Shape 反推 Generated/Modified/Deleted 中间关系或私有 token系统 exact=false 不变。

新增 config/freecad-parameter-mutation-plan.jsonconfig/freecad-parameter-mutation-report.jsonscripts/generate-freecad-parameter-mutation-report.mjs。矩阵把每个 35 个 feature family 分成 nominal 参数、非法边界、两个以上参数快照、编辑-重算-恢复事务、FCStd 往返五项;报告从现有 FreeCAD/Chrome 黄金证据抽取,不把 outcome-only 记录当参数快照。当前为 1/35 family 完整、35/35 nominal、35/35 invalid boundary、15/35 参数变体、6/35 编辑恢复、34/35 往返;门禁输出 freecad-parameter-mutation-fail-closed,并已通过 check:execution-plan 接入默认 verify

运行 ./npmw run generate:freecad-parameter-mutations 可在新增原生黄金模型后更新报告;./npmw run check:freecad-parameter-mutations 会拒绝陈旧报告。只有每个 family 都有真实参数快照及编辑后重算/恢复证据,且阶段 builder、MappedNameRef/StringHasher 和同构来源边界同时闭合,才允许继续评估 EX-REL-01,不允许通过修改 claim 或能力矩阵字段绕过。

227. 2026-08-10 ORA 运行时全量探针、TSN 阶段证据与真实 oracle lane

桌面 FreeCAD 1.1.1 已通过真实 GUI 入口完成全量注册对象探针:352 个注册文档对象 TypeId348 个可实例化,4 个明确记录原生不可用,累计 5510 个运行时属性元数据及默认值。check:freecad-desktop-oraclecheck:freecad-oracle-coverage 均验证通过;源代码索引包含 766 个 TypeId 声明、202 个文档对象使用点,其中 6 个使用点尚无对应运行时注册对象,因此 exact 仍保持 fail-closed。

TSN 阶段门禁已接入默认执行计划。Pad 证据为 25 条跨 modified/generated 记录Pocket 为 42 条记录,含普通两阶段和 two-sided 四阶段的 source/result/topology/relation/cleanup 校验;当前原生 provider 只捕获 cut/fuse/pad 三类操作19 类目标操作仍缺 16 类逐阶段证据,且 MappedNameRef/StringHasher 私有 token 仍是明确阻塞项。

真实 oracle lane 已在固定桌面安装上完成 27 个命令,包含 ORA、Part/PartDesign/Sketcher、FCStd roundtrip 与 exact naming gatesWASM lane 已重跑 Chrome Pad/Pocket history harness。源代码网络抓取在本地因 GitHub 超时,验证使用显式 FREECAD_SOURCE_OFFLINE=1 的同一 pinned checkoutCI 默认路径仍执行真实 tag/submodule fetch不会把离线缓存当作成功证据。

228. 2026-08-10 Builder、参数恢复、FCStd 与命名证据闭合

参数 mutation 不再由结果数量代替事务证据。新增共享 FreeCAD 运行时采集器,逐项保存参数编辑前、编辑后和恢复后的属性快照、有效 Shape、BRep 摘要、体积/面积/边界以及恢复等价性12 个 Part 核心族、6 个 Part builder 和现有 PartDesign 成功 oracle 均接入该协议。生成矩阵现在为 35/35 nominal、35/35 invalid boundary、35/35 parameter variant、35/35 edit/recompute/recovery、35/35 FCStd roundtripincomplete=0blockers=[]

FCStd 双向往返新增真实 Part::Cut 穿孔文档:20 x 20 x 10 Box 由半径 3、高度 12、位置 (10,10,-1) 的 Cylinder 贯穿切除FreeCAD 1.1.1 重算结果为有效单 Solid、7 个面、体积 4000-90*pi,重新保存后 Web 检查器恢复 Base/Tool/Refine、Placement 与 Shape resource。往返门由 22 个场景增为 23/23,因此 Part::Cut 的第二个往返要求和全部 35 个族均已满足。

TSN 门不再只读取 Pad/Pocket 两份报告。它现在汇总 16 份 Chrome/WASM 原生 history 报告,逐份校验 provider、operation registry、Worker/WASM、关系计数、结果 Solid、stage input/result/topology、专用 marker 和释放后 0/019 类 operation 的证据为 19/19,缺失为 0。Pocket、Revolution、Groove、Hole、MultiTransform 的 17 个显式 stage 继续逐级校验,其他专用 builder 由操作报告和 marker 绑定。EX-TSN-01 因此更新为 completedexact 计划计数为 2 completed / 36 in_progress / 14 pending / 0 blocked

命名 oracle 同时修正了旧的误分类。FreeCAD 运行时 219 个阶段中74 个派生/操作阶段要求私有 MappedName现为 required=74 / complete=74145 个基础或支持阶段由原生 API 明确返回 IndexedName-only,不再被错误统计为 145 个缺失私有 token。42 个 Part/PartDesign builder 阶段均具有直接 getElementHistory/getElementMappedName/getElementIndexedName 证据,结果为 42/42、missing 0。这只闭合锁定 oracle 的证据,不代表浏览器 OCCT 能为任意新模型执行 FreeCAD 私有命名算法:浏览器仍没有 MappedNameRef/StringHasher callback ABI原生 token 仍限于 fixture/oracle非唯一同构来源仍必须保持 ambiguous。

真实 CI oracle lane 已调整为先重跑核心参数、全部 Part/PartDesign、复合命名和 FCStd oracle再生成参数报告并执行检查Chrome lane在所有 test:chrome-* 重跑后执行 19-operation TSN 聚合门,避免读取旧报告。当前 systemExact=falseEX-TSN-02=pendingEX-TSN-04=pendingEX-REL-01=pending、exact modules 0/34;剩余工作不得用锁定 fixture 的 token 代替浏览器实时私有命名回调。