# Web FreeCAD 接续执行状态 更新时间:2026-08-03(FreeCAD 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-shape:Facade 暴露 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. 接续操作 ```bash 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 verify`、`git diff --check` 和 JSON 校验。 4. 单独提交并推送 `main`,不得把凭据写入仓库。 ## 7. 2026-08-03 P2 接续进展 本轮已完成 schema v5 迁移运行器、最近 5 版文档检查点、`loadCheckpoint()`、配额预检、资源清扫计划/API 和 1000 次写队列压力实现。完整门禁已通过,并由提交 `6bfbdf5` 推送到云仓库。后续 TSN 里程碑把 schema 提升到 v6,以 `objects.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.ts`:Shape 生成成功后读取对象 `Placement`,通过 `geometry.applyPlacement()` 执行平移/轴角旋转;恒等 Placement 不创建额外 Shape;成功后释放局部 Shape,缓存只提交变换后的句柄。 - `tests/facade.test.ts`:新增非恒等 Placement 与恒等 Placement 的执行器测试。 - `docs/continuation-status.zh-CN.md`、`config/compatibility-matrix.json` 及两份实施方案:记录本里程碑的能力边界和验证证据。 已完成的当前工作区验证: ```text ./npmw run test:facade -> 61/61 通过 ./npmw run build -> 通过 ``` 完整 `./npmw run verify`、`git diff --check` 和 `jq 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_json`,fallback 保存/加载已验证快照深克隆;真实 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 与 Fuse;Task 更新 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` 标签已在线核验到提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`;`fetch:freecad-source` 只接受该提交并使用 detached checkout。 - `configure:freecad-native` 和 `build: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 全功能对标主任务账本](freecad-complete-parity-backlog.zh-CN.md),以锁定源码 `src/Mod` 的 34 个模块和 `App/Base/Gui/Main` 通用能力为完整范围。账本把任务拆成 `INV`、`BASE`、`BYB`、`CORE`、`TSN`、`SK`、`PART`、`PD`、`FC`、各工作台任务和 `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` 访问几何。 兼容矩阵新增 `sourceScope`(34 个模块)和 `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 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`、`guiUp=false`;当前构建可加载 `Part`、`Material`、`Measure`,Sketcher/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 `bb75017e915f6509a4bfa8b551f853352754c2da`(8.0.0)构建 `TKBO`、`TKDESTEP`、`TKXSBase`、`TKDE` 和 Embind WASM,`./npmw run test:occt-history` 通过,`shapeToStep -> booleanHistoryFromStep(cut)` smoke case 返回 42 条原生关系记录。`mapNativeOcctHistoryRecords` 与 `createNativeOcctStepHistoryBridge` 已把 provider 协议接入 Facade 类型边界。该 provider 当前仍是独立 WASM 实例;跨 Bitbybit 主 WASM 只能通过 STEP 文本序列化交换,不能直接传递指针。 ## 15. 2026-08-03 原生 OCCT 历史 + STEP 跨 WASM 桥接 - `native/occt-history` 现从 OCCT `bb75017e...` 编译 `TKBO`、`TKDESTEP`、`TKXSBase` 和 `TKDE`,Embind 暴露 `Generated`、`Modified`、`IsDeleted`、`STEPControl_Reader/Writer`、`shapeToStep` 与 `booleanHistoryFromStep`。 - 原生 smoke 已验证 `shapeToStep(makeBox()) -> STEP text -> booleanHistoryFromStep()`,`cut` 返回 42 条历史记录;最终 wasm 在 Node 22.23.2 可实例化。 - 由于当前 Emscripten/OCCT 大型静态链接的 wasm 异常控制流限制,依赖库固定 `-O0 -fexceptions`,Embind 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..08`、`TSN-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 当作浏览器证据。 本轮文档变更验证必须使用项目包装器: ```bash ./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 全功能对标执行路线图](freecad-reference-execution-roadmap.zh-CN.md),按 R0 参考环境、R1 几何/拓扑、R2 Sketcher、R3 参数化核心、R4 FCStd、R5-R8 工作台与平台长尾、R9 发布门禁连续执行。近期先完成完整桌面 O2 oracle、机器清册差分、真实浏览器原生历史三方黄金,再进入 planegcs 与 PartDesign 完整闭环。 ## 18. 2026-08-03 全功能执行 WBS 与机器门禁 新增 [FreeCAD 1.1.1 全功能对标执行 WBS](freecad-full-parity-execution-wbs.zh-CN.md) 和 `config/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.mjs`、`scripts/check-freecad-source-inventory.mjs` 和 `config/freecad-source-inventory.json`。生成器读取锁定 FreeCAD `src/Mod` 与 `InitializeFreeCADBuildOptions.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..06` 与 `ORA-*` 任务补齐。 新增 `scripts/generate-freecad-type-property-inventory.mjs`、`scripts/check-freecad-type-property-inventory.mjs` 和 `config/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.py` 和 `run-freecad-reference-probe.mjs` 已扩展 ORA-02 模块状态模型。探针现在验证 12 个目标模块,并对每个模块输出 `compiled`、`importable`、`guiRequired`、`guiAvailable`、`runtimeStatus`;本机 headless oracle 实测汇总为 `compiled-importable: 3`、`not-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` 现在公开 `shapeCount`、`kernelReferenceCount`、`releasedShapeCount`、`peakShapeCount` 和 `peakKernelReferenceCount`。`BitbybitGeometryRuntime` 在 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.wasm`,SHA-256 为 `1b6a8fc7b83d222854f73b66af8d0e45ad4fdee025904b447e885d4e18ae8656`。兼容矩阵现在将其标为 `compiled-artifact-verified`;`missingBuildInputs` 仅表示无法从当前 Bitbybit 源快照独立重建该产物,不再表示浏览器 WASM 不存在。 ## 22. 2026-08-03 P02 三端与三方门禁收口 - `BROWSER-OCCT-01` 已完成:Chrome 真实加载 JS/WASM Worker,COOP/COEP 隔离、OPFS 写读删、初始化、42 条 history、取消恢复、Worker 重启恢复通过。 - `MEM-OCCT-01` 已完成:Chrome 运行 1000 次 Boolean,WASM 堆初始/峰值/结束均为 128 MiB(峰值预算 256 MiB、保留 0),浏览上下文由 `measureUserAgentSpecificMemory` 实测保留 469828 bytes(预算 64 MiB);3000 个 OCCT 句柄全部释放,Boolean Worker 未创建 GPU 资源且存活数为 0。静态门禁:`./npmw run check:browser-occt`。其他浏览器测试延期至全部任务完成并收到明确通知。 - `BYB-03`、`BYB-05`、`BYB-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`/`BRepGraphEdgeInfo`、`GetFaceSurfaceType` 和 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`,定义 `Support`、`MapMode`、`AttachmentOffset` 的类型和验证边界,并以四元数合成支持放置与局部偏移,轴角结果做确定性数值归一化。Sketch 对象现在暴露 `MapMode` 和 `AttachmentOffset` 属性;所有变更仍经 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 blocked;Chrome 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 现在提供 `projectGeometry` 和 `carbonCopy` 事务。Projection 会克隆源几何并强制标记为 construction;CarbonCopy 为指定几何生成带前缀的独立副本,同时拒绝与已有几何或同一批次新几何冲突的 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 blocked;FreeCAD 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.cpp`、`Constraints.cpp`、`SubSystem.cpp`、`qp_eq.cpp` 和 `GCS.cpp`。浏览器适配层只补齐 Console、TimeElapsed 和导出宏,未修改上游求解器。上游使用 `std::async`,因此产物启用两个 pthread,并把 COOP/COEP 与 SharedArrayBuffer 作为 Chrome 门禁前置条件。 JavaScript 产物为 125594 bytes,SHA-256 `04a7c687970ea24276e689114fba4d4f0a09dd1da578e4625185df2c234de3fb`;WASM 为 445615 bytes,SHA-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 和一个端点 Distance;Ellipse、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 模型边界新增 `validateSketchGeometry`、`validateSketchSnapshot` 和 `sketchGeometrySignature`。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 的 `Weight`、`InternalAlignment` 和 `SnellsLaw` 约束字段、索引和值,并纳入规范化约束签名和数值校验。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-persistence` 与 `check:chrome-persistence`。Chrome 在 COOP/COEP 隔离页面中真实启动 `persistenceWorker`,能力报告为 `mode: sqlite-opfs`、SQLite WASM true、OPFS true、schema v6;Document 版本 7 保存/加载、checkpoint、资源 hash 写读释放和 `PRAGMA integrity_check` recovery 均通过。 这条证据只关闭 OPFS 项目存储的浏览器运行条件,不提升 FC-04..FC-11:FreeCAD `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.xml` 和 `GuiDocument.xml`,将属性按 XML 类型写入,并通过 opaque entry 机制保留未知/代理资源字节;保留路径冲突、路径穿越和 XML GuiDocument 根节点校验。生成结果立即经 `inspectFcstdArchive` 读回,对象类型、Label、未知资源路径和属性值回归通过。 该切片仍是 metadata-only:没有把 Shape/BRep、ViewProvider 状态、Expression/Link/TopoRef 或 FreeCAD 原生 feature serializer 偷换成字符串;FC-04 继续 `in_progress`,FC-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:` 只读属性。表达式仍不会在导入阶段执行,原始值可供后续引用迁移与安全审计使用;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 或 deleted,External 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 规则新增删除和重排回归:已删除对象不会保留为悬空 Tip,Body 子项重排后选择最后一个未抑制的单实体特征,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 执行 difference;Recompute 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 新增 `storeFcstdShapeResources` 和 `project.fcstd.storeShapes`:FCStd 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:false`,DOCTYPE/ENTITY 仍被拒绝。视图内容保持只读 metadata,不执行 ViewProvider 或脚本。 GuiDocument inspection 进一步提取按归档顺序排列的 View name、type 和 visibility 条目,供视图差异与 round-trip 报告使用;未知 ViewProvider 字段继续由原 XML opaque preservation 保留。 GuiDocument writer 新增结构化 `guiViews` 选项,受控生成 name/type/visibility View XML 并可被 inspector 双向读回;原始 `guiDocumentXml` 与 `guiViews` 互斥,空 view name 明确失败。Facade 测试现为 110 项。 Object extension inventory 已加入 FCStd inspector:从 declaration 和 ObjectData 收集 Extension type/name,按归档顺序去重,但不实例化未知 extension。Facade 测试现为 111 项;extension 原 XML 仍由 opaque rewrite 保留。 FCStd XML 入口现在强制 `Document.xml` 和 `GuiDocument.xml` 使用各自标准根节点,移除任意根节点 fallback;损坏归档会在对象/View 映射前失败,避免被误判为合法空文档。DOCTYPE/ENTITY 禁令及 opaque resource 保留合同不变。 ## 55. 2026-08-04 FCStd typed XML writer increment FCStd writer 不再把所有属性统一写成 ``: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 文本通过 `ReadSTEPFromString`、`ReadIGESFromString`、`ReadBREPFromString` 实例化 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.json`,`check:chrome-app-e2e` 已接入整套 `verify`。当前证据为 Chrome 150、OPFS `sqlite-opfs`、canvas 736x664/20 色、页面异常 0;QA-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,拒绝必须抛出 `Error`,p95 预算为 50 ms。`test:fcstd-fuzz` 已接入 `verify`,QA-04 从 `pending` 转为 `in_progress`;geometry/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 Worker;p95 预算为 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::Extrude` 与 `Part::Revolution`:两者分别调用 Facade 的 `geometry.extrude` 和 `geometry.revolution`,不再把 Part 对象误判成 PartDesign 特征。Extrude 读取 `Base/Dir/LengthFwd/Reversed/Symmetric`,Revolution 读取 `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/LengthFwd` 与 `Source/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 要求至少两个闭合、无孔 section;`standalone`、`additive`、`subtractive` 分别映射 Part Loft、与 Base union、从 Base difference,Shape ownership/version 在进入 Worker 前校验。几何 fuzz 已加入独立/加料合法样本及 section 数量、孔边界恶意样本。 Recompute Engine 支持 `Part::Loft`、`PartDesign::AdditiveLoft`、`PartDesign::SubtractiveLoft`,兼容完整 `Sections` 与 `Profile + Sections` 链接形式,并将各 Sketch 的 Placement/Attachment 变换应用到截面坐标。回归覆盖三种模式、重复/缺失链接、Base 缺失和 Bitbybit Loft 失败后保留上一版有效 Shape。`PD-LOFT` 从 `pending` 转为 `in_progress`;transition、带孔高级 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.pipe`;`Part::Sweep`、`PartDesign::AdditivePipe`、`PartDesign::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::PropertyLink`、`LinkList`、`Vector` 和 `Placement` 也改用对应原生 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 index;Part 对象保持文档顶层且不改写 Body Tip。Part 工作台的 `Part::Loft`/`Part::Sweep` 和 PartDesign 的 `Additive/SubtractiveLoft/Pipe` 也已接入任务工厂,分别保存 `Sections` 或 `Profile/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.makeThickSolidByJoin`;Arc/Intersection 两种 join 明确映射,未知模式直接拒绝。没有移除面的 Thickness 任务在命令状态层禁用,避免生成不可重算对象。 命令任务已注册 Draft/Thickness 的 Angle/Value 属性、稳定面前置条件和 Body Tip 更新;Thickness 的 Base solid 仍为普通 Link,RemoveFaces 保留原生 LinkSub。Facade 回归现为 122/122,覆盖 validator、稳定 face 解析、Bitbybit 调用参数、缺失面/非法 join 诊断和命令任务属性。Chrome 150 几何门禁现在真实执行 11 个操作(含 `draft-selected-face` 与 `thickness`),所有 mesh 非空,17 个 ShapeHandle/15 个 kernel reference 在释放后回到 0/0,页面异常为 0。计划计数保持 30 completed、21 in_progress、32 pending、0 blocked;PD-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.extrude` 后 `union`,Part `Revolution.Symmetric` 使用正反轴半角 `geometry.revolution` 后 `union`,PartDesign Pad/Pocket 支持 `SideType=Two sides` 及旧 `?TwoLengths`,Pocket 两侧依次 Boolean Cut;PartDesign Revolution/Groove 的 `Midplane` 和 `Two angles/Angle2` 现在分别执行正反轴两次 Revolution/Groove,Revolution 结果 Fuse,Groove 在同一 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 现在保存 `Position`、`Direction`、`Reversed`、`Type`、`Diameter` 和 `Depth`,并将位置/方向写入圆形切削 Profile 与 Bitbybit Pocket。`Dimension`/`Through all` 仍由统一 Pocket 合同执行,零方向、非法尺寸和未知孔深类型在 Worker 前产生硬诊断。 Bitbybit 1.1.1 没有名为 Hole 的高阶操作,但它提供圆柱、圆锥和 Boolean Cut;因此 FreeCAD 的 `HoleCutType=Counterbore/Countersink` 被拆解为主圆柱孔加二次圆柱/圆锥刀具,`DrillPoint=Angled` 和 `Tapered/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/Spacing`、`Offset`、`Reversed` 和第二方向 `Direction2/Length2/Offset2/Occurrences2/Mode2/Reversed2`:Extent 按总 Length 在首末实例间分配,Spacing 按 Offset 作为每步距离,第二方向按笛卡尔实例序列组合并限制总实例不超过 100;Polar Pattern 增加 `Mode=Extent/Spacing`、`Offset` 和 `Reversed`:Extent 保持总 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;未知第三方类型继续 proxy,FeaturePython 继续 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/Symmetric`、`Type=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 的 `Midplane`、`Two angles` 和 `Angle2` 属性,Recompute Engine 现在把对称模式拆为正反轴两个半角操作,把 Two angles 拆为 `Angle` 与 `Angle2` 两个方向的 Bitbybit Revolution;Groove 则在同一 Base 上顺序执行两个方向的 Bitbybit Groove Cut,并释放中间 Shape。`To last`、`To first`、`Up to face` 等依赖支持面的模式不再静默降级,统一返回硬诊断。 任务属性模板和任务面板已增加 Type、Reverse angle、Symmetric to plane;Facade 回归覆盖 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 `FeatureLinearPattern` 与 `FeaturePolarPattern` 源码,Linear/Polar 的 `Spacings`、`SpacingPattern` 已按“显式单项 > 周期模式 > 全局 Offset”累加;Linear Extent、Polar 360 度 Extent 分别遵循 FreeCAD 的首末距离和避免重合末实例规则。`PropertyFloatList` 已加入 Facade 属性模型、编辑器和 FCStd 原生 `FloatList count + Float` XML;`PropertyStringList` 同步改为 `StringList count + String`,reader 继续兼容旧 JSON 编码。 PartDesign `Transformed.Originals` 现在可为 Mirrored、MultiTransform、LinearPattern、PolarPattern 提供多个原始 Shape,组合时只释放临时副本,不释放文档缓存 Shape。`TransformMode=Features` 在当前 whole-shape Bitbybit 组合边界返回 `TRANSFORM_MODE_UNSUPPORTED`,避免把局部特征历史伪装成全形状变换。Facade 回归增至 126 项通过;Chrome 150 几何门禁新增非均匀 Linear/Polar pattern,24 个操作 mesh 均非空,64 个 ShapeHandle/52 个 kernel reference 释放后为 0/0,pageErrors 为 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` 现在使用结构化 `ShapeResourceValue`,writer 生成 FreeCAD 原生 ``,并要求 `file` 是同一 FCStd 归档内的安全 `.brp/.brep` entry;绝对路径、路径穿越、非 BRep 扩展和悬空资源全部硬失败。reader 将 `Part` 指针解析为 shape resource,并在归档清单阶段校验对象属性不会指向缺失文件;Facade 属性编辑器显示资源路径但不执行外部文件。 锁定 FreeCAD 1.1.1 oracle 已读取 Web writer 生成的有效盒体 BRep:`Shape.isNull=False`、`isValid=True`、`1 solid`、`6 faces`、体积约 `24`。FreeCAD 回写后的 FCStd 再由 Web inspector 读回 `Box.Shape.brp`、8863 bytes 和 `ElementMap`,OPFS `storeShapes` 继续按内容寻址资源边界保存。Facade 回归升至 130/130,FCStd 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.exportBrep` 与 `geometry.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/0,pageErrors 为 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` 根是 ``,显示对象存于 `ViewProviderData/ViewProvider/Properties`,而不是早期 Web 内部的 `` 结构。Inspector 现在同时兼容两个根:原生路径校验 `ViewProviderData Count`、ViewProvider/Properties Count、对象名唯一性、`Camera` 之外的 XML 节点和外部资源;旧 `` 仍只读保留,便于历史 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 FCStd,无 `GuiDocument.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` 现在保留原生 `` 指针,并将 `ShapeResourceValue.elementMapResource` 纳入 Facade 类型、writer、reader、BRep 实例化引用和安全校验。写出要求 `.Map.txt` 位于同一 FCStd ZIP 的 `opaqueEntries` 中;缺失、路径穿越、重复 ElementMap2、错误扩展名均在 ZIP 生成/解析前硬失败,避免拓扑历史退化为未声明附件。 Inspector 将 `.Map.txt` 标记为 `topology-map`,以 fatal UTF-8 读取 `BeginElementMap v1`/`EndMap` 帧,解析 `PostfixCount`、`MapCount` 以及 Edge/Face/Vertex 的 `NameCount`,并按字节长度和稳定 FNV 内容 hash 输出 `elementMapResources` 摘要。锁定的 `PartDesignExample.FCStd` 已通过真实样例读取:17 个对象、21 个 BRep、13 个被 Shape 属性引用的 ElementMap2,首个 Body map 报告 `PostfixCount=63`、`MapCount=2` 及 Edge/Face/Vertex 名称计数;浏览器仍只使用 Chrome/Bitbybit,未引入第二套几何实现。 Facade 回归升至 133/133,Chrome 150 几何门禁 25/25、ShapeHandle/kernel reference 释放后 0/0,生产构建和 `git diff --check` 通过。该切片完成的是 ElementMap2 文件指针与格式摘要边界,不宣称已把 FreeCAD 历史 token 重建为可编辑 TopoRef;FC-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 现完整保留 ``、`Part.HasherIndex` 和文档级 `StringHasher2 -> StringHasher.Table.txt`,并自动写出锁定的 `ProgramVersion`、稳定非零对象 id、`ObjectDeps`、`Touched`、`UseHasher` 与瞬态 `_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=0`、`ElementMap=1.15.70200.5`、`Dummy -> Dummy`、`Body.Shape.Map.txt` 的 PostfixCount=63/MapCount=2 和 StringHasher 表。Chrome 150 仍以 Bitbybit 为唯一几何入口,25 个操作、BRep 6/12/8 拓扑与质量属性通过,66/54 资源释放到 0/0;Facade 133/133、构建和 diff 门禁通过。 该增量完成原生 Shape/ElementMap 文件恢复链和双向保存证据,但尚未把 FreeCAD 历史字符串 token 映射成 Web TopoRef 候选,也未完成 100 模型 FCStd 批量质量/容差黄金;FC-05/FC-06 继续 `in_progress`,83 项计划计数保持 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 重新组装 FCStd,经 `xvfb-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 原生 ``,Percent/Integer 使用 ``,String/Bool 使用对应原生节点,NaN、非安全整数和 0..100 外百分比在生成 ZIP 前硬失败。`ObjectDeps` 现在来自文档依赖图并拒绝悬空对象,不再固定写 Count=0。 数据侧 Enumeration 改为索引式 Integer;动态枚举写入 CustomEnumList,reader 校验 count 并恢复选项标签。锁定桌面 FreeCAD 已从同一个 Web FCStd 重算四基元和三 Boolean:Box/Cylinder/Sphere/Cone 体积与声明参数一致,Fuse/Cut/Common 分别得到 24/23/1 的体积,所有结果均为有效单 solid;动态 `WebMode=Manufacturing` 与 `WebProgress=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/GeometryList` 与 `Sketcher::PropertyConstraintList/ConstraintList`。几何覆盖 Point、LineSegment、Circle、ArcOfCircle、Ellipse 和 BSplineCurve,包含构造标志、B 样条 pole/weight/knot multiplicity 与确定性 native id;隐藏的 `WebGeometryIds` StringList 保留 Web 字符串 ID,FreeCAD 回存后可恢复约束引用。约束覆盖 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 仍保持 pending,83 项计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。 ## 80. 2026-08-04 FC-06 Sketcher ExternalGeo 原生往返增量 FCStd writer 现在为 Web Sketch 外部投影生成 FreeCAD 原生 `ExternalGeometry`(`App::PropertyLinkSubList`)、`ExternalTypes`(`App::PropertyIntegerList`)和 `ExternalGeo`(`Part::PropertyGeometryList`)。`ExternalGeo` 包含 FreeCAD 必需的 H/V 轴线、`SketchGeometryExtension`、`ExternalGeometryExtension Ref/Flags/RefIndex` 以及只读构造投影;native geometry id 与内部几何共享单调编号,避免恢复时被 FreeCAD 重编号。隐藏的 `WebExternalIds`、`WebExternalProjectionIds` 和 URI 编码 `WebExternalSources` 保留 Web 外部对象 ID、投影 ID 及完整 TopoRef topologyVersion/generation/signature/candidates。 当前无损写出边界只放行 `stable` 状态且指向同一文档已声明对象的原生 `EdgeN`/`VertexN`;Vertex 必须对应点投影,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 + Sketch`:Sketch 保持 10 个内部几何、11 个约束,其中 `PointOnObject` 原生引用外部投影;`ExternalGeometry=1`、`ExternalTypes=[0]`、`ExternalGeo=3`(两轴加 `ExternalBox.Edge1` 投影)。桌面回存后 Web inspector 恢复 `external-box-edge`、`external-box-edge-projection` 和 topologyVersion=3/generation=2/signature 的完整 TopoRef。Facade 回归升至 139/139,FCStd 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 依赖仍保持 pending;83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。 ## 81. 2026-08-04 FC-06 Sketch Attachment 原生往返增量 FCStd writer 现在把 Web Sketch 的 `Support`、`MapMode`、`AttachmentOffset` 转为现代 FreeCAD 原生字段:`AttachmentSupport` 使用 `App::PropertyLinkSubList`,`AttachmentOffset` 使用原生 Placement,`MapMode` 使用 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、candidates,FreeCAD 另存后 reader 会先核对原生 AttachmentSupport,再恢复完整 Web TopoRef。历史 Facade 默认的未声明 `XY_Plane + Deactivated` 只保留为 Web 兼容元数据,不伪造悬空 FreeCAD Link。 锁定 FreeCAD 1.1.1 已实际打开、重算并另存 Web 生成的 `ExternalBox + Sketch`:`MapMode=FlatFace`、`AttachmentSupport=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 的 55 种持久化模式、多引用 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 约束;桌面报告原生类型 `SnellsLaw`,Web 回读精确恢复两个端点、boundary 和 1.2 数值。旧的不完整快照仍可读取,但原生写出会硬拒绝,避免伪装成无损格式。 B-spline `Weight` 现在按 FreeCAD 原生内部几何模型写出:每个被约束 pole 生成一个 `Part::GeomCircle`、`internalGeometryType=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::exposeInternalGeometryForType` 与 `Constraint::Save` 源码,FCStd codec 已覆盖 Web Sketch 模型当前声明的全部内部对齐:`ellipse-major/minor` 分别生成 `Part::GeomLineSegment + internalGeometryType=1/2`,`ellipse-focus` 的索引 0/1 分别生成 `Part::GeomPoint + type=3/4`,`bspline-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 TopoRef;writer 按 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 + Sketch`:1 个可编辑点、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 的三种组模式:`projection`、`intersection`、`both`,分别原生映射为 `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 + ModeSketch`:Face1 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 Shape,Web 再解析仍得到 17 个对象和同样 8 个 proxy。Facade 回归升至 146/146,FCStd 报告为 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 通过、未知差异 0;20 条已知差异严格限定为 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/Z,Bitbybit 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 原生 `Angle1`、`Angle2`、`Angle3`(默认 `-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_INVALID`、`SPHERE_ANGLE2_INVALID`、`SPHERE_LATITUDE_RANGE_INVALID` 或 `SPHERE_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 原生属性映射。参数覆盖 `Radius1`、`Radius2`、`Angle1`、`Angle2`、`Angle3`,默认值与 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.988706403508727`,Chrome 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 保持同名同义:`Polygon`、`Circumradius`、`Height`、`FirstAngle`、`SecondAngle`;正多边形从 `(Circumradius, 0, 0)` 开始逆时针生成,顶面位移严格使用 `[Height*tan(FirstAngle), Height*tan(SecondAngle), Height]`。Polygon 被限制为 3..10000 的安全整数,半径/高度和两个 `-89.99999..89.99999` 角度在进入 Worker 前硬校验。FreeCAD resave 会把 Polygon 的类型提升为 `App::PropertyIntegerConstraint`,FCStd decoder 现将该类型以及 `App::PropertyFloatConstraint` 作为有限数值恢复,不再退化为字符串。 Bitbybit 1.1.1 的普通 face extrusion 对正多边形返回缺顶盖的无效 Shape,两截面 Loft 虽有正确拓扑但仍无法通过结构检查,因此最终实现没有接受这些结果。`BitbybitGeometryRuntime.createPrism` 改用同一 Bitbybit Worker 的公开 `createPolygonWire`、`createFaceFromWires`、`shapes.shell.sewFaces` 和 `shapes.solid.fromClosedShell`:底面/顶面按外法向反向,侧面逐边生成,闭壳后再创建 solid。浏览器没有直接调用 OCCT、自定义 BRep 或第二套内核;Bitbybit 仍是唯一几何接口。 锁定 FreeCAD 1.1.1 已打开、重算并另存六边形 `R=2/H=10/FirstAngle=10/SecondAngle=-5`:1 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 primitive,83 项状态保持 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 的公开 `createPolygonWire`、`createFaceFromWires`、`sewFaces` 和 `fromClosedShell`。实现连接两端矩形的六个定向平面面;当远端矩形退化为边或点时,连续重复点会被移除,零面积端面被省略,剩余三角/四边面重新 sew 成一个 solid。没有直接调用浏览器 OCCT、手写 BRep 或第二套几何入口;Bitbybit 仍是唯一接口。 锁定 FreeCAD 1.1.1 已打开、重算并另存默认远端收缩 Wedge(`Xmin/Ymin/Zmin=0`、`X2min/Z2min=0`、`Xmax/Ymax/Zmax=10`、`X2max/Z2max=8`):1 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/360`;Radius1/2 必须为正,Radius3 允许零(零按 FreeCAD 兼容规则复用 Radius2),角度范围和上下界在进入 Worker 前硬校验。Bitbybit 运行时使用公开 `createSphere` 与 `transforms.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/20:FreeCAD 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 使用对应原生节点。 `Position`、`Direction`、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 FCStd:Extrusion 得到 1 solid、体积 `30`,Revolution 得到 1 solid、体积 `36π`;另存后规范 TypeId、Link、参数和 Shape 资源均由 Web inspector 恢复。FCStd round-trip 报告稳定为 22/22,未知差异 0。 `Part::Loft` 的 `Sections/Solid/Ruled/Closed/MaxDegree/Linearize`、`Part::Sweep` 的 `Sections/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/146,Chrome 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`,直接调用公开 `WriteIGESToString`;Facade 暴露 `exportIges` 并校验 `.iges/.igs` 文件名和非空文本,MockFacade 同步转发。Chrome 导出页面已启用 IGES,GLB/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/0`,`check:chrome-geometry-features` 与全量 verify 通过。该增量不宣称 IGES 拓扑索引可直接作为稳定 TopoRef,83 项计数保持 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 页面异常为 0,COOP/COEP、Canvas、OPFS 保存重开、STEP/IGES/STL/BREP 导出选择均通过;`check:chrome-app-e2e` 与全量 verify 通过。该证据只验证 UI 入口,不宣称导入格式已自动创建持久化 DocumentObject,83 项计数保持 30 completed、21 in_progress、32 pending、0 blocked。 ## 99. 2026-08-05 QA-08 Chrome 可访问名称门禁 Chrome E2E 在移动端起始页扫描所有可见 `button/input/select/textarea` 控件,要求每个控件具有 `aria-label`、`title`、文本或 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 或 face,STEP/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`,读回均为 solid;IGES 共 `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/0`;Chrome 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 clients;GET 请求采用 network-first,网络失败回退缓存,非 GET 和跨源请求不拦截。Chrome E2E 验证 manifest 200、`/start` start_url、`/` scope、standalone display,COOP/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=/start`、`shell=true`、`heading=true`,页面异常为 0;独立 Chrome checker 和全量 verify 通过。该切片关闭基础断网 shell 回退,仍需安装/升级、缓存版本迁移、SQLite/OPFS 离线写入与电源中断恢复彩排。 ## 107. 2026-08-05 REL-01 service worker 缓存迁移静态门 `check:pwa` 现在强制检查 service worker 的缓存版本常量、旧 key 过滤和 `caches.delete(key)` 清理逻辑,同时保留 `skipWaiting`、`clients.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.mjs`、`config/sbom.cdx.json` 以及 `generate:sbom`/`check:sbom`。生成器只读取 `package.json`、`package-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.mjs`、`config/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.ts` 和 `config/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/0`;checker 和全量 `verify` 强制检查三角形阈值及数值有效性。 该切片建立 QA-05 的高细分 Chrome 基线;百万三角形 P95/峰值内存、大装配、多标签长会话和大表格预算仍未完成,QA-05 不提前关闭。 ## 113. 2026-08-05 TSN-03 Chrome 原生 Boolean history Worker 回放 新增 `chrome-native-history-harness.html` 和 `test:chrome-native-history`。Chrome 150 实际启动独立 `NativeOcctHistoryWorkerProvider`,由 Bitbybit Worker 导出两个 Box 的 STEP 文本,写入并清理 OPFS 标记文件,再交给 `native/occt-history` Embind WASM 执行 `cut` 的 `Modified/Generated/Deleted` 收集;Facade 只接收版本化协议和映射后的稳定关系记录,不传递 ShapeHandle 指针。报告记录 provider 能力、OCCT 版本、关系计数和最终 ShapeHandle/kernel reference `0/0`,`check:chrome-native-history` 已纳入全量 `verify`。 该证据关闭 native history 的 Chrome Worker/STEP/资源释放 Boolean 子项;provider 能力仍只声明 `fuse/cut/common`,PartDesign Pad/Pocket/Loft/Pipe/Revolution 等特征的原生 Generated/Modified/Deleted 尚未实现,TSN-03 继续保持进行中。 ## 114. 2026-08-05 QA-07 CSP 与权限安全基线 新增 `public/_headers`、`config/security-baseline.json` 和 `scripts/check-security-baseline.mjs`。静态部署合同和 Vite preview 同时声明 COOP/COEP/CORP、CSP(self-only、`wasm-unsafe-eval`、Worker blob、禁止 object/frame、无 `unsafe-eval`)以及关闭 camera/microphone/geolocation/payment 的 Permissions-Policy;checker 还扫描 `src` 中的 `dangerouslySetInnerHTML`、`new Function` 和 `eval` 动态执行入口。 该切片把 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-256;`check: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.html`、`test:chrome-fault-injection` 和 `check:chrome-fault-injection`。Chrome 150 在真实 `PlanegcsWorkerProvider` 上先完成 planegcs WASM 求解,再通过可控 WorkerLike 包装器终止当前 Worker 并派发错误事件;provider 将旧 Worker 清理、重建新 Worker 并重新初始化,第三个 Worker 恢复求解得到端点 `(5, 0)`。同一回放还验证 coordinator 的取消结果为 `cancelled`、文档版本变化结果为 `stale`,不会把过期解提交给文档。 故障注入期间在 Chrome OPFS 根目录创建零字节标记文件,读取确认后执行清理,并再次读取得到 `NotFoundError`;3 个创建过的 Worker 在 provider `dispose` 后全部标记为已终止。报告固定 `browserId=chrome`、`crossOriginIsolated=true`、`SharedArrayBuffer=true`,checker 已纳入全量 `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_MakePrism` 的 `prismHistory`/`prismHistoryFromStep`,协议能力从 `fuse/cut/common` 扩为 `fuse/cut/common/pad`,Pad 请求只携带 profile STEP 和有限非零 direction,不伪造 Boolean tool。关系记录支持 `resultKind`:矩形 Face profile 的 4 个顶点保留并各生成一条 Edge,4 条 profile Edge 各生成一个 Face,profile Face 保留为结果 Face;Chrome 150 Worker 回放共 25 条关系(13 modified、12 generated、12 条跨 kind),输出为有效 1 solid、6 faces、体积 `30`,Worker dispose 完成。 该切片把原生 Generated/Modified/Deleted 合同真正延伸到一个已实现的 Pad/Prism 子集,并保留 STEP 跨 WASM 边界;Pad 仍要求真实平面 Face profile,solid 会由 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 仍为 `pending`:PART-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`,明确声明 `horizontal`、`vertical`、`distance`,仍拒绝多几何和未绑定高级约束。 Node smoke 与 Facade 回归覆盖 Horizontal/Vertical 两个方向并验证 Embind vector 释放。Chrome 150 专用 Worker 回放同时得到 Horizontal 端点 `(5,0)` 与 Vertical 端点 `(0,5)`,两者求解状态为 `0`、残差为 `0`,并保留 completed/cancelled/recovered/stale 生命周期证据;WASM 新哈希为 `622b725bd86d304786b9046a879f7e7e85907890cc78c4527df0cd0f79b4698d`,artifact 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、圆弧/椭圆为 5,B-spline 按控制点与权重参数计数。此前统一按每个 Block 加 2 会让被锁定线段或圆错误显示剩余 DOF;新增 Facade 回归确认 blocked line/circle 均为 `solved`、`degreesOfFreedom=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 适配新增 `solveParallelLines` 与 `solvePerpendicularLines`。原生求解固定第一条线和第二条线起点,只让第二条线方向收敛并保持给定长度;返回向量包含两条线坐标、求解状态和归一化方向残差。Facade `solvePlanegcsSubset` 对外仍按两条线的 8 个几何参数计算 7 个剩余自由度,仅接受一个 driving Parallel 或 Perpendicular 关系,并拒绝退化线、额外 driving 约束和非线几何。 Node smoke 覆盖 Horizontal/Vertical/Parallel/Perpendicular 四种原生调用,四者求解状态均为 `0`、残差均为 `0`,Parallel 第二条线收敛到 `(0,2)->(5,2)`,Perpendicular 收敛到 `(0,2)->(0,7)`;WASM artifact 新哈希为 `9e056ae7776485910460e9222b4268d02e0e0396a7917e4a68a0d51b8f706343`。Chrome 150 专用 Worker 与 Facade 回放验证同样的端点和资源释放,并保留 `completed/cancelled/recovered/stale` 生命周期证据;`check:planegcs-artifact`、`check: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 新增 `pocketHistoryFromStep`:Worker 接收 base STEP、平面 profile STEP 和有限非零方向,先用 `BRepPrimAPI_MakePrism` 生成切削体,再用 `BRepAlgoAPI_Cut` 收集 base/profile 两侧的 `Generated/Modified/Deleted`。协议能力从 `fuse/cut/common/pad` 扩为 `fuse/cut/common/pad/pocket`,Facade `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/0`;OPFS 临时标记创建、读取和清理也通过。Node native smoke、Facade 151/151、`check:occt-history-artifact`、`check: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.39822368615503`(`24π`)、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、单角度的原生 Revolution;Two 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 history(Modified base face、Deleted profile face),不会返回空历史。新增 `makeRectangleFacePlaced` fixture 绑定,避免基体边界共面导致退化。 Chrome 150 真实回放使用 Bitbybit Geometry Worker 创建 10×10×8 原点盒体和内部 1×3 profile,执行 Groove(axis `[0,0,0]`、direction `[0,1,0]`、360°),再把 Bitbybit 导出的 Base/Profile STEP 交给原生 history Worker。结果 `structuralValid=true`、`structuralErrors=0`、1 solid、10 faces/18 edges/12 vertices、体积 `781.1504440784611`(`800 - 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 `59c0bcc0ad48e0ea177ac65d792325ec4dd01557fc8741953d256550c31dbbf5`;`check: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 对照最小 fixture:reference 返回 `under-constrained`、3 DOF 且端点保持不变;同值 dimension 返回 `under-constrained + REDUNDANT_CONSTRAINT`;不同值 dimension 返回 `conflicting + CONSTRAINT_CONFLICT + SOLVER_NOT_CONVERGED`。Chrome 页面创建、读取并删除 OPFS marker,`check: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 取得稳定分类:`closed`、`open`、`multi-ring`、`self-intersecting`、`invalid-nesting`、`non-planar`、`degenerate`;有效闭合/多环输入无异常,其他五类返回对应的 `open`、`self-intersecting`、`contained directly`、`coplanar`、`collinear` 错误文本。 Chrome 页面创建、读取并删除 OPFS marker(`suite=SK-11`、`cases=7`),报告 `crossOriginIsolated=true`,`check: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-2`;extend/trim 分别得到 `x=15`/`x=7` 且不修改源;自动约束建议顺序稳定为 `coincident,horizontal` 并可一次性应用;事件回放报告 `applied=2`、`undone=1`、`redone=1`、最终端点 `x=6`。 Chrome 页面创建、读取并删除 OPFS marker(`suite=SK-09`、`operations=6`),`check: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、periodic:3 个 poles 的中点更新为 `(2,3)`,degree `2→1`,weights 为 `[1,0.5,1]`,knots 为 `[0,0,0.5,1,1]`,periodic 为 `true`;原始 Sketch 签名保持不变。无效 weight、knots、degree 均在事务提交前返回明确校验错误,失败不会污染源快照。 Chrome 页面创建、读取并删除 OPFS marker(`suite=SK-10`、`fields=5`),`check:chrome-sketcher-bspline` 已纳入全量 `verify`。该切片证明领域模型的 B-spline 编辑和原子校验,不宣称 planegcs 已支持 B-spline 求解、真实 GUI 控点拖拽、周期曲线重参数化或 FreeCAD 全量 B-spline 约束 fixture;SK-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 marker(`suite=SK-12`、`models=500`、`solves=1000`),`check: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.48699804303837`、`98.69604401089352`、`41.569219381653056`、`120`);Helix 作为 wire 以 `linearLength=25.839014719433763` 验证。五个 ShapeHandle 在释放前为 `5/5`,释放后 `shapeCount/kernelReferenceCount=0/0`。 Chrome 页面创建、读取并删除 OPFS marker(`suite=PART-ALL`、`operations=5`),`check: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,覆盖 `Source`、`Spreadsheet`、`Cut`、`Sketch` 四对象;ExpressionEngine 恢复 `Spreadsheet.Width * 2`,Part Link 恢复 `Cut.Base=Source`,Sketch Support 的稳定 `TopoRef` 恢复为 `Source.Face1`,Sketch 几何 ID `profile` 保持不变。归档同时包含 `Front`/`Top` GuiDocument 视图和 20-byte BRep `Part/Source.Shape.brp`,ElementMap `1` 与 1 条映射条目均可检查;报告确认 expression/link/topo-ref 三类依赖语义和 OPFS 归档读取。 Chrome 页面创建、读取并删除 OPFS binary marker(`suite=FC-06`、`archiveBytes=1761`),`check: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::Mirrored`、`PartDesign::LinearPattern`、`PartDesign::PolarPattern`、`PartDesign::MultiTransform` 和 `PartDesign::Hole`。每一步都验证预览任务提交、Base 链接、Body.Tip 重定向、参数写入、异步重算和 ShapeHandle 保留;最终 Body.Tip 为 `hole`,5 个特征均为 `completed`。 Chrome 页面把 12 个对象保存到 SQLite OPFS 后加载并再次重算,版本 `29`、对象数 `12`、持久化模式 `sqlite-opfs`;同时创建、读取并删除 OPFS marker(`suite=PD-TRANSFORM`、`operations=5`)。5 个 ShapeHandle 在释放前为 `6/6`,`dispose()` 后 `shapeCount/kernelReferenceCount=0/0`,`check: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=sketch`、`Sections=[sketch001]`、Body.Tip 为 `additive-loft`。随后注入重复截面,Chrome 返回 `LOFT_SECTIONS_DUPLICATE`,失败期间保留最近有效 Shape(Shape ID 不变),恢复链接后再次重算为 `completed`。 同一回放继续提交 `PartDesign::AdditivePipe` 的 Profile/Spine/Base 链。当前 Bitbybit 1.1.1 管线对该文档截面/路径组合返回明确 `GEOMETRY_EXECUTION_FAILED`,未产生 ShapeHandle,且 OPFS 保存/加载保留失败对象和版本 `42`;该失败被作为显式能力差异记录,而非静默成功。Chrome 页面创建、读取并删除 OPFS marker(`suite=PD-LOFT`、`operations=2`),失败后释放资源为 `0/0`,`check: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 mm`、`Length=Width*2`、单元格引用、重复 Alias 拒绝、B1/C1 循环、绝对地址规范化、绑定、样式/合并/命名范围迁移和非法地址;Spreadsheet 公式继续复用统一 Facade Quantity 表达式语义,不引入绕过 Bitbybit Facade 的页面入口。 新增 Chrome 150 `chrome-spreadsheet-harness.html`:`Width` 从 6 mm 更新到 8 mm 后 `Length` 从 12 mm 重算为 16 mm,并绑定到 `pad.Length`;Undo/Redo 分别恢复 12/16。Facade 表达式桥接 `Spreadsheet.Length + 1 mm` 得到 13 mm,循环 `C1↔D1` 显式诊断,CSV 为 2 行 4 列;同一回放验证 4 个样式单元格、命名范围 `A1:A3`、合并范围 `A1:C3` 和插入后公式地址 `A3`。绑定后的文档以 `sqlite-opfs` 保存/重开,版本 20、属性值 16;939-byte Spreadsheet snapshot 通过 OPFS 内容寻址资源写入、读取和释放,直接 OPFS marker(`cells=9`)也完成创建、读回和删除,ShapeHandle/kernel reference 最终为 `0/0`。`check:chrome-spreadsheet` 和 `test: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-label,SHA-256 为 `2183f0d048c9689f8865f11e2964e994c44cb1f7c03e382d7c1b99c805eba2a2`;CSV 为 156 bytes、7 行,SHA-256 为 `5879d47bdda947b5432ef38a03a6e8299cdb4e90cfea0370e398833a9c01244a`。两份导出均通过 SQLite/OPFS 内容寻址资源写入、读回和释放,直接 OPFS marker 也完成创建、读取和删除,最终 ShapeHandle/kernel reference 为 `0/0`。`check:chrome-plot` 与 `test: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/Scale,Offset 长度 8,5 个对象保留 `sourceId=line`,2 个 Layer 持久存在。1567-byte Draft snapshot 通过 SQLite/OPFS 内容寻址资源写入、读回和释放,直接 OPFS marker 创建、读取和删除,ShapeHandle/kernel reference 最终为 `0/0`;`check:chrome-draft` 与 `test: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-label,SHA-256 为 `ef240c4ee443e4386a80b001621c75424c9a8d75707f5cb3a5c3a65298274c97`,重复导出字节一致;SVG 与 1644-byte TechDraw snapshot 均通过 SQLite/OPFS 内容寻址资源写读释放,直接 OPFS marker 创建、读取和删除,ShapeHandle/kernel reference 为 `0/0`。`check:chrome-techdraw` 与 `test: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 两个 Box,Assembly 将 Base 固定、Shaft 先重合再保持 5 mm 距离;2 个 Joint 均为 `solved`,迭代数 `2`,Shaft X 为 `5`,诊断数为 `0`。848-byte Assembly snapshot 通过 SQLite/OPFS 内容寻址资源写入、读回和释放,直接 OPFS marker(`suite=ASM-CORE`、`components=2`)创建/读回/删除,最终 ShapeHandle/kernel reference 为 `0/0`;`check:chrome-assembly` 与 `test:assembly` 已纳入全量 `verify`。 该切片推进 `ASM-CORE` 的组件、连接器、基础约束和资源边界,不宣称 Assembly 的完整旋转/运动求解、碰撞与干涉、BOM/Exploded View、变体、大装配性能、FreeCAD Assembly oracle 或 FCStd 工作台闭环已完成;`ASM-CORE`、`ASM-TOOLS`、`ENG-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 marker(`suite=MESH-CORE`、`triangles=12`)创建/读回/删除,最终 ShapeHandle/kernel reference 为 `0/0`;`check:chrome-mesh` 与 `test:mesh` 已纳入全量 `verify`。 该切片推进 `MESH-CORE` 的三角网格规范化和基础修复,不宣称完整 Mesh/MeshPart 算法(高级 hole filling、remesh、decimation、self-intersection repair)、曲率/法向工具、PLY/STL 全量 round-trip、实时 GUI 或 FreeCAD Mesh oracle 已完成;`MESH-CORE` 与 `ENG-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 MassProperties,CSV 为 4 条测量记录。Inspection snapshot 通过 SQLite/OPFS 内容寻址资源读写释放,直接 OPFS marker(`suite=INSP-ALL`、`measurements=4`)创建/读回/删除,最终 ShapeHandle/kernel reference 为 `0/0`;`check:chrome-inspection` 与 `test:inspection` 已纳入全量 `verify`。 该切片推进 `INSP-ALL` 的测量、质量和依赖诊断基础,不宣称完整剖面/截面比较、GD&T、容差带、点云偏差、批量报告模板、实时 GUI 或 FreeCAD Inspection oracle 已完成;`INSP-ALL`、`PLATFORM-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 marker(`suite=BIM-CORE`、`elements=1`)创建/读回/删除,最终 ShapeHandle/kernel reference 为 `0/0`;`check:chrome-bim` 与 `test:bim` 已纳入全量 `verify`。 该切片推进 `BIM-CORE/BIM-IFC` 的对象层级、材料、数量和最小导出边界,不宣称 IFC2x3/IFC4 完整 schema、真实 IfcProduct 几何、分类/PropertySet 全覆盖、门窗族、碰撞/空间分析、实时 GUI 或 FreeCAD BIM oracle 已完成;`BIM-CORE`、`BIM-IFC`、`ENG-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 返回 `collision`,G-code 不会静默导出。 新增 Chrome 150 `chrome-cam-harness.html`:通过 Bitbybit Geometry Worker 创建 `5×2×3` Box 作为 Job 目标,建立 1 把刀具和 1 个 Profile Operation,生成 5 点闭合矩形路径;Simulation 为 `pass`、碰撞数 `0`,G-code 非空。CAM snapshot 通过 SQLite/OPFS 内容寻址资源往返和释放,直接 OPFS marker(`suite=CAM-ALL`、`operations=1`)创建/读回/删除,最终 ShapeHandle/kernel reference 为 `0/0`;`check:chrome-cam` 与 `test:cam` 已纳入全量 `verify`。 该切片推进 `CAM-ALL` 的 Job/Stock/Tool/Operation/Simulation/G-code 基础边界,不宣称完整刀路算法、3/5 轴运动学、真实材料去除仿真、碰撞几何、后处理器、刀具库、FreeCAD Path oracle 或生产 CAM 安全门禁已完成;`CAM-ALL`、`PLATFORM-CLOSURE` 继续保持 `pending`,计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。 ## 144. 2026-08-05 FEM-ALL 材料/网格/载荷/参考求解增量 新增 `facade/fem.ts`,提供 Material(Young 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 marker(`suite=FEM-ALL`、`nodes=2`)创建/读回/删除,最终 ShapeHandle/kernel reference 为 `0/0`;`check:chrome-fem` 与 `test:fem` 已纳入全量 `verify`。 该切片推进 `FEM-ALL` 的材料、网格、载荷、参考求解和结果边界,不宣称完整 3D FEM 单元、网格生成/质量、接触/非线性/热分析、真实 solver Worker、VTK 结果、FreeCAD FEM oracle 或工程安全验证已完成;`FEM-ALL`、`PLATFORM-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 marker(`suite=ROBOT-ALL`、`poses=5`)创建/读回/删除,最终 ShapeHandle/kernel reference 为 `0/0`;`check:chrome-robot` 与 `test:robot` 已纳入全量 `verify`。 该切片推进 `ROBOT-ALL` 的关节/轨迹/导出基础边界,不宣称完整机器人模型、逆/正运动学、碰撞/奇异位形、控制器通讯、真实仿真、后处理或 FreeCAD Robot oracle 已完成;`ROBOT-ALL`、`PLATFORM-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 marker(`suite=DATA-ALL`、`records=7`)创建/读回/删除,最终 ShapeHandle/kernel reference 为 `0/0`;`check:chrome-data` 与 `test:data` 已纳入全量 `verify`。 该切片推进 `DATA-ALL` 的模块登记、格式边界和 proxy 可诊断性,不宣称 Points 点云处理、Reverse Engineering 拟合、OpenSCAD 执行、IDF/JT 语义解析、完整 Material 卡或批量 Import 已完成;`DATA-ALL`、`ADDON-ALL`、`SCRIPT-ALL`、`PLATFORM-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` 实现;构建清单启用 `TKFillet` 与 `TKBool` 依赖。Node smoke 通过 STEP round-trip,Box 全边圆角返回 150 条关系(6 modified、72 generated、72 deleted),结果为有效 1 solid。Chrome 150 真实回放由 Bitbybit Geometry Worker 创建 Box 并执行 Fillet,再将 Base STEP 交给独立 native history Worker;Facade 映射只保留稳定源对象/子形状关系,OPFS marker 创建、读取、删除通过,runtime ShapeHandle/kernel reference 最终为 `0/0`,结果体积 `215.79398223686158`。 `test:chrome-native-fillet-history` 和 `check:chrome-native-fillet-history` 已纳入全量 `verify`,Chrome 报告记录 provider `occt-native.history-step`、OCCT `8.0.0` 和 `step-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` 与有限正数 `distance`,Direct provider、Dedicated Worker、STEP bridge 和 Bitbybit GeometryRuntime 均显式声明并路由该操作。共享 dress-up collector 逐源子形状读取 `Modified/Generated/IsDeleted`,Node 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 history;Chrome 结果为有效 1 solid、体积 `215.52000000000004`,OPFS marker 创建/读取/删除通过,ShapeHandle/kernel reference 最终 `0/0`。`check: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` 单输入协议,显式传递 `radius`、`depth`、`position` 和 `direction`;OCCT 通过 `BRepPrimAPI_MakeCylinder` 创建定向圆柱刀具,再以 `BRepAlgoAPI_Cut` 生成真实孔切削及逐源 Modified/Generated/Deleted 关系。Node smoke 通过 STEP round-trip:10×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.584073464102`,6 modified/2 deleted,OPFS marker 创建/读取/删除通过,ShapeHandle/kernel reference 最终 `0/0`。`test:chrome-native-hole-history` 和 `check:chrome-native-hole-history` 已纳入全量 `verify`,artifact hash 同步到兼容矩阵和 OCCT drift baseline。该切片只覆盖显式位置/方向的圆柱直孔,不宣称 Threaded、Counterbore、Countersink、Through-all、面 Support、AttachmentOffset、选边 transport 或完整 PartDesign Hole history;TSN-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=true`、`nativeRecoveredAvailable=true`;原有 planegcs Worker 取消、崩溃恢复和 stale 结果继续保持通过。 故障注入 server 补充同源 `/native/occt-history/` JS/WASM 路由,OPFS 0 字节标记仍完成创建、读取、删除,planegcs/native Worker 在 dispose 后分别回收 `3/3` 与 `2/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-migration` 与 `check: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 增加 `TKOffset` 与 `BRepOffsetAPI_DraftAngle`,协议显式传递单个 face index、角度、拔模方向、中性面原点/法向和 Reversed;Direct 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.999999999999986`;OPFS marker 创建/读取/删除通过,Bitbybit ShapeHandle/kernel reference 最终为 `0/0`。原生 JS/WASM SHA-256 更新为 `24a169bf8ba9514c7efec2c3fca078c6ec51ab94b23dd87307a9298fa6d039b4` 与 `953e5af0e2849f0cf6a11515d00e1c348ae4af68b378e95c5bba9cfeee21ea4b`。 复核确认早期跨 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 join;Direct 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.57600000000002`;OPFS marker 完成创建/读取/删除,ShapeHandle/kernel reference 最终 `0/0`。Bitbybit 自身质量报告仍为 `structuralValid=false`,该差异被显式保留,未伪装成完全有效。原生 JS/WASM SHA-256 为 `d820099a48b49b9c0265b7c796eb56475048aac9c12ea74a0598ad9cf7dae0b1` 与 `00f08a4f6db36801b4e3ef023bf664eac4f122c4b055cd9e90c747e5d956ddf0`。 该切片不宣称多移除面、正 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 deleted);Bitbybit/原生体积为 `12`/`11.999999999999995`,原生结果有效 1 solid,OPFS 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 solid;OPFS marker 删除且资源最终 `0/0`。Bitbybit Fuse 的 `structuralValid=false` 继续作为显式兼容差异。原生 JS/WASM SHA-256 为 `002ffbf60e8a14d6f5f7061cb3373e2ea55c25082c85721f2686497b8ade6ad0` 与 `ea82356e89ba66a43f3f104a94b9901defaacf92cc704f5f2492e5a3c7678f57`。 三实例以上、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 deleted),Bitbybit/原生体积为 `3`/`2.999999999999999`,原生结果有效 1 solid;OPFS marker 完成创建、读取、删除,ShapeHandle/kernel reference 最终为 `0/0`。Bitbybit Fuse 的 `structuralValid=false` 继续作为显式兼容差异。原生 JS/WASM SHA-256 为 `667cd5197a6a2d424c024b7f91e155d01e98e50f0490727b78b3cd3aed90b033` 与 `5cfaa223915bd1ef1b05387c219799218e326b716d51e9f1f5431fa533cb9f56`。 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-transform`、`transformKind=linear` 后返回 66 条关系(64 modified、0 generated、2 deleted);Bitbybit/原生体积为 `12`/`11.999999999999995`,原生结果有效 1 solid。OPFS marker 记录特征与步骤类型并完成删除,ShapeHandle/kernel reference 最终为 `0/0`;Bitbybit 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)`,接受 2–6 个二实例 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 deleted),Bitbybit/原生体积为 `4.999999999999999`/`4.999999999999998`;OPFS marker 记录有序步骤并完成删除,ShapeHandle/kernel reference 最终 `0/0`。原生 JS/WASM SHA-256 更新为 `19dba01de37ba5f225f85d5ca5247e2e91cb0241c7b7f372f06862cca5c91ea9` 与 `bd400e38977c5269dbfddb5dcf484794ba5a814b7dc7ff1547ceaa5fa1e45fe5`。 当前原生有序图仍限制每步二实例、最多 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 分别作为 `object` 和 `tool` 输入,按顶点/边采集真实 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 单实体体积 `20`;OPFS marker 完成创建、读取、删除,ShapeHandle/kernel reference 最终 `0/0`。Bitbybit loft 质量报告仍为 `structuralValid=false`,不据此宣称其结构有效。 原生 JS/WASM SHA-256 更新为 `d427666c4d25e281b6a969da49eabe421dbc868430b7839944ceeceea2c17c47` 与 `8d80d032d43fd4be0a90552ad893469f504da6d2e8d6868942186687084e944b`。该切片推进 `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 | log`:log 轴范围必须为正,绑定或更新系列时 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 约束 fixture:Chrome 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.end` 到 `second.start`,不满足时显式回退/拒绝,避免伪装成完整约束图。 Chrome 150 Dedicated Worker 回放原生 Coincident 状态 `0`、残差 `0`,第二条线起点精确收敛到第一条线终点;Provider capabilities 增加 `coincident`,并继续验证 completed/cancelled/recovered/stale 生命周期。WASM SHA-256 更新为 `27a79ec784bcfc3006dd1cd4ecddc860856d6c180f95ae4f7df0517432262687`;`check:planegcs-artifact`、`check: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` 的正值 DistanceX;Vertical/任意端点组合继续显式拒绝,避免将有限子集冒充完整尺寸图。 Chrome 150 Dedicated Worker 回放 DistanceX 状态 `0`、X 差值 `6`、Y 坐标一致、残差 `0`;Provider 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 坐标一致、残差 `0`;Provider capability 增加 `distanceY`,Node 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 Distance;DistanceX/DistanceY、任意端点、两线夹角和圆弧半径继续显式拒绝,避免把受控子集当作完整尺寸图。 Chrome Dedicated Worker 回放 45 度、长度 `5`,原生状态为 `0`,长度残差约 `4.2e-14`、角度残差约 `2.2e-16`;Provider capability 增加 `angle`,completed/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 Radius;Diameter、Arc、圆与其他几何的关系、多约束图和参考尺寸继续显式拒绝,避免将最小圆图当作完整 Sketcher 尺寸支持。 Chrome Dedicated Worker 回放圆心 `(2,3)`、目标半径 `4`,原生状态为 `0`、残差 `0`;Provider capability 增加 `radius`,completed/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`、直径残差 `0`;Provider capability 增加 `diameter`,completed/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 增加 `solveEqualLines` 与 `solveEqualCircles`:前者直接使用 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-16`;Provider `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-12`;Provider capabilities 增加 `point`/`symmetric`,Facade 生命周期和 OPFS/资源释放门禁继续通过。`build:planegcs`、`check:planegcs-artifact`、Chrome harness/check、`Facade 165/165`、`git diff --check` 均通过;WASM SHA-256 更新为 `99c6c47c127802dac91539fa7b34ed389b453d126c821679b2d4c20af8f53abe`。 该增量不关闭完整 SK-06/SK-07:PointOnObject、完整端点组合、几何图联合求解、冗余/冲突最小集、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`、残差 `0`;Provider 增加 `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 必须为平面 Face,Spine STEP 必须为单 Edge、两个端点;原生 collector 通过 `Generated`、`FirstShape`、`LastShape` 和 `Generated(Spine, Profile)` 返回 Profile 顶点/边、端盖以及 Spine Edge/端点的可解释 `Generated/Modified` 关系。新增 `pipeHistoryFromStep`、`makeLineWire` 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/0`。`test:chrome-native-pipe-history`、`check:chrome-native-pipe-history`、`check: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`、残差 `0`;Facade 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 分别为 `64740c6c91360a3339c859fed0d91101f69f438033dd579d620e1de3ee51b784`、`add952b864759a3245eb753c9fef63c4289bd3999cffa09f6b4fb5bbd78ae261`。该增量移除 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 和一个无效几何索引失败 fixture;24/24 全部通过,失败路径均记录原生 `IndexError: Constraint has invalid indexes`,成功路径记录约束计数、求解状态和自由度。SnellsLaw 成功基线为 8 DOF,Block 为 0 DOF/fully constrained。 `probe:freecad-sketcher-constraints` 可重新运行桌面 oracle,`check: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/n1`;ratio 大于等于 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 分别更新为 `702d267b856b8a1c9d1a031fbbd9780419c3e359a99d7d6922b5df668ed79d2e` 与 `e62049ed4e3385f3e4a2a90ede42ea9940ab1add10cc6771ade43a66aa7e67d6`。 该增量关闭 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-7`,Provider 返回 `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.5`,InternalAlignment/Weight 残差均为 `0`;Provider 返回 `completed`、11 DOF。最终 JS/WASM SHA-256 分别为 `702d267b856b8a1c9d1a031fbbd9780419c3e359a99d7d6922b5df668ed79d2e` 和 `6acf170b2cb87c4287c1b814d899612d89048d9b0eac244a84c4916f07ca27d7`。 `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 种顶层约束类型:`Coincident`、`Horizontal`、`Vertical`、`Parallel`、`Tangent`、`Distance`、`DistanceX`、`DistanceY`、`Angle`、`Perpendicular`、`Radius`、`Equal`、`PointOnObject`、`Symmetric`、`InternalAlignment`、`SnellsLaw`、`Block`、`Diameter`、`Weight`。每种类型各有一个桌面成功 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-constraints`、`check: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_INTERSECTING`、`PROFILE_INVALID_NESTING`、`PROFILE_DEGENERATE` 和 `PROFILE_NON_PLANAR`。Facade 运行时测试确认孔在外环之前的输入仍以一个 hole 进入 Pad,bow-tie 与分离环在运行时调用前被拒绝。 Chrome 150 + OPFS profile harness 从 7 项扩展到 10 项,直接导入生产 `sketchProfile` 验证四点外环、一个孔及两类错误码;marker 创建、读取、删除通过。`test:chrome-profile-validation`、`check: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_OPEN`。`probe/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=false`(20/40 个结构错误),但 Shape 类型、体积、实体数和网格均正确;Compound 双实体报告为有效。该质量判定差异已保留在 Chrome 报告中,不作为 SK-11 的 FreeCAD profile 消费结果伪装或删除,后续由质量/内核门禁继续追踪。 ## 184. 2026-08-06 SK-09 交互编辑与键鼠生命周期收口 新增锁定 FreeCAD 1.1.1 的 Sketcher editor oracle,真实调用 `moveGeometry`、`split`、`extend`、`trim`、`toggleConstruction` 与 Document transaction。七项结果全部通过:Horizontal 约束拖动将目标端点保持在 `(8,2)` 并把另一端移到同一 Y;Split 在 `(4,0)` 生成两段 construction Line 和 Coincident;Extend 将长度 `10` 墠量 `5` 到端点 `(15,0)`;Trim 借助 `x=7` 切割线生成端点 `(7,0)` 和 PointOnObject;construction 切换为 true;事务 Undo/Redo 在端点 `8→5→8` 间恢复;Coincident+Horizontal 自动约束以 `0` 状态求解并收敛连接点。 Web 编辑语义同步修正:受 Horizontal/Vertical 约束的 drag 优先保持被拖点,并移动同线另一端;Split 添加稳定 ID 的 Coincident;Trim 命中其他 Line 时添加 PointOnObject。新增 `SketchEditorInteractionSession`,统一管理工具、指针手势、选择、事务历史以及 `Ctrl/Cmd+Z`、`Ctrl/Cmd+Y`、`Escape`、`Delete`。Chrome 150 harness 真实分发 3 个 `PointerEvent` 和 3 个 `KeyboardEvent`,9 项操作/生命周期证据与 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 `InternalAlignment` 与 `Weight=1.25`,导出后再次导入 FCStd,几何与约束逐字段一致;归档大小为 `1493` 字节,权重为 `[1,1.5,1.25,1]`,节点保持夹持形式。 同一检查器交叉读取真实 planegcs Worker/Provider 和 FreeCAD 1.1.1 oracle:Weight 与 InternalAlignment 残差均为 `0`,Provider 返回 `completed`、11 DOF,FreeCAD Weight fixture 求解状态和残差均为 `0`。`test/check:chrome-sketcher-bspline`、`check: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`,确定性差异和意外结果均为 `0`;Chrome 实测总耗时约 `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-stress`、`check:freecad-sketcher-constraints`、`check:freecad-sketcher-editor` 及相关 Chrome 检查全部通过;SK-12 转为 `completed`,P04 全部完成,机器计划计数为 `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-10`、`5.097643906992744e-8`、`1.8189894035458565e-12`;BREP 保持 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 个失败场景,语义比较未知差异为 `0`。`test/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 all`、`Midplane`、`Two sides` 和双锥度分向执行;同时修正 Through-all 刀具体跨度,确保草图位于基体表面时仍贯穿整个实体。Revolution/Groove 的 Midplane 与 Two angles 组合路径继续由正反轴原生操作完成。 新增 FreeCAD 真实 `PartDesign::Body/Sketch/Pad/Pocket` oracle,5/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` 的重算和 Undo,Pad/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.0000000000001`,Pipe 使用 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` oracle,4/4 有效单实体,体积锁定为 `1/1/π/(100-π)` 且 Pipe transition 为 `Transformed`。Chrome Loft/Pipe 原生 OCCT history 分别记录 `24/28` 条并释放为 `0/0`;Chrome、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 写入 `PropertyLinkSub`,Body.Tip 随特征更新;Thickness 重算补齐 `Reversed` 符号语义。Chrome 150 Facade 场景在非对称 Hole 基体上连续创建 Fillet、Chamfer、Draft、Thickness,再串联 Mirrored、LinearPattern、PolarPattern、MultiTransform 和最终 Hole,共 10 个正体积结果。注入歧义 Edge 时返回 `DRESSUP_EDGE_REFERENCE_UNRESOLVED` 并保留上一 Shape;Pad `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` oracle,4/4 有效:体积锁定为 `997.8539816339743/995/1500/424`,选边/选面、Draft reversed、Thickness reversed 与拓扑数量均有断言。Chrome 原生 OCCT history 分别记录 `150/150/5/38` 条;Facade `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 工具,再按显式方向、轴或平面应用到当前 support;MultiTransform 按步骤顺序展开。每个 PartDesign 结果在拓扑提交前执行真实 OCCT 质量报告并要求恰好一个 solid,非法非连接结果稳定返回 `PARTDESIGN_SINGLE_SOLID_REQUIRED`。变换任务属性和界面补齐 `Originals`、`PlaneOrigin/PlaneNormal`、`DirectionVector`、`AxisOrigin/AxisDirection`。 Hole 增加 ISO Metric/Fine、UNC/UNF/UNEF、NPT、BSP、BSW/BSF 与 ISO Tyre 标准合同,支持规格或显式 major/pitch、Right/Left、线程深度和 clearance;`ModelThread` 使用真实 Helix + solid pipe 对预钻孔执行螺旋切削。Chrome 150 的 14 步链得到 14 个正体积单实体,其中 Feature Linear/Mirrored 体积 `357.3810870283411/354.26859542168523`,M1 化妆线程为 `363.66427233552065`,三圈 M2x0.4 左旋模型线程为 `347.12633973440813`。版本 `41` 经 sqlite-opfs 重开后 Tip 为 `hole003`,ShapeHandle/kernel reference 最终 `0/0`。 FreeCAD 1.1.1 oracle 的 Feature-list LinearPattern/Mirrored 均为有效单实体、体积 `423.99999999999994/416.00000000000006`;ISO 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`,每阶段均为一个 solid,Body.Tip 始终是 `pad`,Sketch.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 ID;Loft 重复 section、Pipe 分叉 path、Fillet 歧义 TopoRef 三种失败均要求保留上一 Shape,修复后生成新 Shape。lifecycle、Loft、Transform 三套 sqlite-opfs 重开分别保持 Tip `pad/subtractive-pipe/hole003`;Pad、Pocket、Loft、Pipe、Revolution、Groove、Fillet、Chamfer、Hole、Draft、Thickness、Linear/Polar Pattern、Mirrored、MultiTransform 共 15 类原生 history 均通过并释放资源。PD-CLOSURE 转为 `completed`,P05 全部完成;机器计划计数为 `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 和只读 proxy;22/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-12`,STEP/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 全部转为 `completed`,P06 完成;机器计划计数为 `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 CSV,0 个求值错误,耗时约 `53.85 ms`。Draft 增加事务式 `trimLine`,变换后的长度由 `8` 修剪为 `4`,Offset、Array、Clone、Layer 和 5 个源依赖保持参数化。Plot 使用真实浏览器 SVG 解码和 Canvas 编码导出 `640x360`、`19408` byte PNG,两次 SHA-256 一致并通过 PNG 签名检查。 生产文档 harness 不再使用占位计数:它实际创建并编辑 Spreadsheet、Draft、TechDraw、Plot,导出 CSV/JSON/SVG/PDF,四个 artifact 版本均为 `2`、文档版本为 `8`;sqlite-opfs 保存、字节往返、释放、重开和依赖闭包全部通过。新增 `check:document-closure` 聚合门禁并纳入 `verify`;TypeScript、五组模块单测、五组 Chrome 回放和各检查器全部通过,ShapeHandle/kernel reference 均为 `0/0`。TD-ALL、SS-ALL、DRAFT-BASE、DRAFT-OPS、PLOT-ALL、DOC-CLOSURE 转为 `completed`,P07 完成;机器计划计数为 `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 与 angle,1000 组件/10 BOM 行构建约 `6.69 ms`,FCStd 中 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 和稳定边界 TopoRef,Chrome 验证 5 patches、20 poles、C0、trim/sew、`1.5` offset 和 4 个 refs。 工程闭包实际串联四个模块,四个 artifact 版本均为 `2`、项目版本 `8`;Assembly placement、BIM FireRating、Mesh transform、Surface offset 均编辑并导出,1000 组件预算约 `5.04 ms`,sqlite-opfs 字节往返、释放、重开和 sourceRef 完整性通过。新增 `check:engineering-closure` 并通过 `check:chrome-engineering` 纳入 `verify`;ASM-CORE、ASM-TOOLS、BIM-CORE、BIM-IFC、MESH-CORE、SURF-CORE、ENG-CLOSURE 转为 `completed`,P08 完成;机器计划计数为 `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 个显式 proxy;Addon 的伪造摘要/越权请求均拒绝,并完成更新、回滚、删除;Script 宏回放显式拒绝 file/network/time/resource 四类能力。七套 Chrome 150 + cross-origin isolation + sqlite-opfs 报告均通过,资源与 ShapeHandle 归零。 新增锁定 34 个 FreeCAD 模块的 `platform-module-coverage.json` 和 `check: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 转为 `completed`,P09 完成;机器计划计数为 `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` bytes;QA-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=0,74 个 dist 文件以 Ed25519 签名并由受控公钥验签。 新增 `release-capability-matrix.json`、`docs/release-runbook.zh-CN.md`、`check:quality-closure` 和 `check:release-closure`。最终矩阵 G0-G9 全部 pass,34 模块为 `exact=0/compatible=24/proxy=7/development=3/unsupported=0`,无 scope-only/unexplained;QA-01..QA-08、REL-01..REL-04 转为 `completed`,P10 完成。机器计划计数为 `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_Convert`、`Points_Merge`、`Points_PolyCut` 和 `Points_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.json` 与 `config/release-capability-matrix.json` 已同步为 `exact=0/compatible=26/proxy=5/development=3/unsupported=0`;`check:chrome-data`、`check:platform-closure`、`check:execution-plan`、`check: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、截图和焦点/命令 oracle;CORE 主责应用壳、菜单、工具栏、工作台、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 View(Model/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。`build`、`test/check:chrome-app-e2e` 和 `git 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`/`0108fd4b4850cc46e625b60e53cea7a7bbe69f8d` 后,CAM 已从原 `CAM-ALL` 的最小兼容合同扩展为可操作的工作台:4 个工具栏组和 5 个菜单组共 60 个 FreeCAD 命名可操作命令,Job 树包含 Model、Stock、SetupSheet、Tools/Controllers 和 Operations;Job、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.json` 和 `check: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 个唯一命令 ID,`notYetSurfacedCommands` 降为 0。 浏览器 CAM 域扩展到 22 种工序和 9 种 dress-up;Dogbone 与 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/12;Chrome 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:false`;OpenCamLib/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 `e84665f2fa9d1151f03282ac7e01320bc65e015b` 到 `CAMotics/`,校验 `GCodeMachine.cpp`、`GCodeModule.cpp` 和 `ToolSweep.cpp`。随后按镜像回退策略补齐 C! 1.7.2 与 SCons,构建并验证 CAMotics 1.3 headless CLI;浏览器仍只执行源码运动契约,不执行 ELF。OpenCAMLib WASM 锁定 `95b036fe28ce6d77c97b98e5fbc337904ae49560`,Chrome 150 实际执行 2 个三角面/14 个刀位点并通过确定性检查;OCCT 实体去除验证 stock `300`、removed `12`、remaining `288`、结构有效单实体、BRep 导出和资源释放 `0/0`。 FreeCAD 原生 CAM oracle 已实际运行 FreeCAD 1.1.1/Qt 6.8.2:Profile 32 条命令/20 条切削命令、56 个动态 CAM 命令、`Path::Feature` 与 `Path::FeaturePython` 原生 save/open/mutate/save/open 通过;Web `Path::PropertyPath` 可编辑 codec 仍保留为显式未闭合项。LinuxCNC 侧新增受控 iframe bridge:父页面只能提交已经生成的 G-code,LinuxCNC 页面负责 `loadProgram`、解析、task/motion 和运行,返回 `parserAuthority: linuxcnc-wasm`;桥接静态测试已通过,端到端 machine acceptance 继续由专用 Chrome 证据门收口。 新增复跑入口: ```bash 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 机器报告为 PASS:5 个 CAD 候选路径点经 OCL 解析成 48 个刀位点,CAMotics 阶段后的 XYZBC 程序为 2758 字节/65 行,LinuxCNC WASM 上游 RS274、task/motion 和 kinematics 先以 `dry-run` 接受,再以 `run` 接受 138 个块及 48 个轨迹段。程序包含 `M428/M429`、`G93/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 S12000`,FreeCAD 重开后由 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 ABI,CAMotics 1.3 headless CLI 已构建。浏览器源码阶段仍只生成运动契约 G-code,Canonical 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-required`;`physicalMotionObserved=false`、`productionOpen=false`。该矩阵只证明 fail-closed 源/配置边界,不是实体执行器、碰撞、计量或生产安全认证。 本轮通过的关键命令: ```bash ./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` 构建 `camsim`、`gcodetool`、`planner` 和 `build/camotics.so`。`camsim --version` 返回 `1.3`;对 `examples/slant_test/slant_test.camotics` 连续运行两次,均输出 120,884 字节、2,416 三角面的合法 binary STL,除 CAMotics 写入的非确定性 80 字节 STL header 外,facet payload 逐字节一致,稳定 SHA-256 为 `969d95c9f468e05d68b06e63f54c8fefb93e31912546751249d014df56d8fd0b`。 新增复跑入口: ```bash ./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 -flto` 和 `STANDALONE_WASM=1`,直接编译锁定 CAMotics 提交中的 `Sweep.cpp`、`ConicSweep.cpp`、`SpheroidSweep.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 和 ABI;Chrome harness 报告 `backend: camotics-upstream-sweep-wasm`,`browserExecutable=true` 仅表示该扫掠内核可执行,`fullCamoticsProgram=false`、`gcodeParserIncluded=false`。完整 CAMotics Qt/TPL/文件系统/`camsim` 程序仍未进入浏览器,LinuxCNC WASM 仍是唯一规范 G-code parser/controller authority。 复跑命令: ```bash ./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 `camsim`、`gcodetool`、`planner` 以及 `build/camotics.so`。Qt/TPL 原生制品通过 `--help`、官方 TPL `10 passed / 0 failed` 和 Xvfb `1200x800` 可见窗口冒烟;CLI 通过 `--help`,OpenCAMLib 门禁也确认这些 sidecar 存在。 证据文件现在把三类运行边界分开记录:宿主原生 CAMotics 程序可用;浏览器只加载 `public/vendor/camotics/camotics-sweep.wasm` 的上游 Conic/Spheroid sweep 子集;LinuxCNC WASM 仍是规范 G-code 的唯一 parser/controller。浏览器报告中的 `browserExecutable=true` 仅指该零 imports sweep kernel 可执行,`fullCamoticsProgram=false`、`gcodeParserIncluded=false` 不变。 本轮最终门禁: ```text 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-key`、`check:release-artifacts`、`check:release-closure` 和 `test:release-signature` 均以同一 Ed25519 公钥复核。发布清单已重新生成;私钥内容不写入 Git、日志、`dist/` 或文档。SBOM 闭环不再硬编码旧的 172,而是与锁定审计清单的当前组件总数一致(当前为 173),避免下次依赖锁定变更再次制造伪阻塞。 ## 208. 2026-08-07 FeaturePython Path 资源级编辑 在不放宽 Python 执行边界的前提下,FCStd Facade 新增 `FcstdPathAccessOptions.allowFeaturePython` 和 `FcstdPathEdit.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=blocked`;Node 报告扩展到 8/8,`check:freecad-cam-path` 通过。该增量关闭了 FeaturePython 路径资源的安全编辑缺口,但没有宣称 Python-backed 属性、重算、完整 operation-object 或全部 Path 算法 exact parity。 ## 209. 2026-08-07 CAM Job 元数据命令闭环 `CAM_Comment`、`CAM_PropertyBag` 和 `CAM_Compound` 不再停留在兼容提示:Job 现在持久化评论、字符串/数字/布尔属性以及由至少两个现有 Operation 组成的复合组。三类对象共用同一 `CamSnapshot`,因此参与版本化 Job JSON、导入校验、OPFS 资源保存和 Undo/Redo;删除 Operation 会自动移除无效复合组。属性名、值长度、集合数量、重复引用和有限数值均有边界校验,旧版没有 `metadata` 字段的 Job 会恢复为空元数据。 CAM Task Panel 已提供对应输入控件,Chrome 150 证据新增类型保持、Job 字节级重开、依赖清理和撤销恢复检查;`test:cam` 13/13、`test:chrome-cam` 与 `check: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 新增带 `objectId` 的 `setMeshes()` 场景注册表,同时保留 `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 生产包回放实际创建 `Box` 和 `Cylinder`,Canvas 报告两个 Mesh;右向左穿越框返回 `box,cylinder`,模型树同步选中两项,WebGL error 为 0、页面错误为 0。该里程碑关闭多对象同时渲染和真实空间框选缺口;仍未关闭的是网格三角剖分边与 OCCT 原生 BRep 曲线/拓扑历史之间的精确语义差异。 ## 213. 2026-08-08 OCCT BRep 边/顶点拾取接线 上一节剩余的三角剖分边误选问题已从正常运行路径移除。`geometry.mesh()` 现在并行读取 Bitbybit `shapeToMesh` 和 `plugins.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 `FaceN`、`EdgeN`、`VertexN` 规则分配名称,Preserved/Modified 关系继承源名称,Generated 分配未占用的新名称,Deleted 与 ambiguous 保留状态和候选来源。Project persistence 会复制并校验名称、唯一性和 transient ID;FCStd 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,新增有序 `inputs`、`stages`、`resultStepByStage` 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 coordinator;Up-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=0`、`unexplainedRelations=0`、`roundtripNameDrift=0`、`elementMap2ParseFailures=0`、`elementMap2SemanticFailures=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` 证据生成 `:.`、`$` 或 `;`,按一基 postfix 表和十六进制 element/postfix/StringID 写出;同时修正 child StringID 的原生 `0.` 兼容规则。文档级 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=0`、`unexplainedRelations=0`、`roundtripNameDrift=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/Length2`,Midplane 拆成等长正反侧,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/0`;Revolution 门新增真实 `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 + Angle2`,profile 先绕同一轴旋转 `-Angle2`,随后只创建一个 Revolution builder;Groove 再以该单一刀具执行一次 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/0`;Groove 体积为 `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 已用仓库内真实 `PartDesignExample`、`EngineBlock`、`BIMExample` 共 1638 个 StringID 校准为逐字节相同写回。FCStd inspection 现在返回结构化 StringHasher document/validation,把 ElementMap2 的 child IDs、suffix IDs 和 `$#id:index` prefix ID 全部闭合到同一表;悬空证据直接拒绝。writer 可接受结构化 `stringHasherTable`,并禁止与 opaque 表同时提供。 30 模型 oracle 现在同时采集 FCStd 中的 `StringHasher.Table.txt`:30/30 case 中 11 个含真实表,连同 91 个 ElementMap2 资源进入 exact gate。新增 `stringHasherParseFailures=0`、`stringHasherSemanticFailures=0`、`stringHasherEvidenceFailures=0`,原有错误绑定、未解释关系、名称漂移和 ElementMap2 三项失败计数继续为 0;Facade 回归为 `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-evidence`、`opaque-preserved`、`final-shape-only`、`ambiguous`、`missing`)。验证器会检查 StringID 是否存在于同一张表、映射是否重复、来源是否完整、歧义是否至少保留两个候选,并拒绝在 `final-shape-only` 阶段附加伪造 token。 native history stage capture 现在携带该证据。GeometryRuntime 对 provider 返回的实际命名证据做 stage/result 绑定校验;provider 只返回最终 Shape 时明确写入 `final-shape-only`,Pocket/Groove/Hole/有序 MultiTransform 等手工复合数组也统一写入同一边界。重算历史保留 `namingEvidence`,ElementMap snapshot 在有证据时深拷贝保存,缺证据不会被升级为 exact。 `elementMap2.ts` 新增跨阶段映射对象和 JSON parser/writer:每个 stage 保存输入 stage、结果对象、原生 token、来源引用和 `stable/ambiguous/generated/deleted` 状态。`ambiguous` 记录候选集合并通过写回验证;同构子形没有唯一来源时不会按数组顺序猜测。新增 30-case 黄金采集字段 `namingEvidenceStatus`:219 个阶段均显式标为 `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=pending`、`completedTasks=1/52`、`exactModules=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=30`、`not-built=4`、`runtimeObjectCount=7`、`staticObjectCandidateCount=1673`,GUI command ID 与观察记录全部对齐。 这关闭了 EX-ORA-01 的“清册与桌面报告未机器对账”子项,但不关闭完整 oracle:4 个未构建模块仍需 build/proxy 决策,1673 个静态对象候选仍需逐对象 runtime probe。`EX-ORA-01` 继续保持 `in_progress`,`systemExact=false`,promotion gate 不受影响。 `config/compatibility-matrix.json` 的 `systemExactEvaluation` 已指向该计划并登记 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.json` 和 `scripts/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`。 复跑命令: ```bash ./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.exact` 与 `systemExact` 均保持 `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.39822368615502` 与 `995.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 成功案例均为有效单 Solid;6/6 缺输入案例均进入原生 Invalid/null Shape,并锁定 `No object linked` 或 `No 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=false`、`EX-REL-01=pending`、`1/52 completed` 与 `0/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-evidence`,`check:freecad-composite-history-elementmap` 与 `check: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.json`、`config/freecad-parameter-mutation-report.json` 和 `scripts/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` 个注册文档对象 TypeId,`348` 个可实例化,`4` 个明确记录原生不可用,累计 `5510` 个运行时属性元数据及默认值。`check:freecad-desktop-oracle` 与 `check: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 gates;WASM lane 已重跑 Chrome Pad/Pocket history harness。源代码网络抓取在本地因 GitHub 超时,验证使用显式 `FREECAD_SOURCE_OFFLINE=1` 的同一 pinned checkout;CI 默认路径仍执行真实 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 roundtrip,`incomplete=0`、`blockers=[]`。 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/0`;19 类 operation 的证据为 `19/19`,缺失为 `0`。Pocket、Revolution、Groove、Hole、MultiTransform 的 17 个显式 stage 继续逐级校验,其他专用 builder 由操作报告和 marker 绑定。`EX-TSN-01` 因此更新为 `completed`,exact 计划计数为 `2 completed / 36 in_progress / 14 pending / 0 blocked`。 命名 oracle 同时修正了旧的误分类。FreeCAD 运行时 219 个阶段中,74 个派生/操作阶段要求私有 MappedName,现为 `required=74 / complete=74`;145 个基础或支持阶段由原生 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=false`、`EX-TSN-02=pending`、`EX-TSN-04=pending`、`EX-REL-01=pending`、exact modules `0/34`;剩余工作不得用锁定 fixture 的 token 代替浏览器实时私有命名回调。 ## 229. 2026-08-11 Sketcher/PartDesign 参数合同与 FreeCAD 私有命名 ABI v1 Sketcher 数据模型和 FCStd codec 已覆盖 FreeCAD 1.1.1 的完整原生几何类型表:在 Point/Line/Circle/Arc/Ellipse/B-spline 基础上新增 `GeomArcOfEllipse`、`GeomArcOfHyperbola` 和 `GeomArcOfParabola`,并补齐 InternalAlignment 原生编号 `5/6/7/8/11` 的双曲线主轴/副轴/焦点与抛物线焦点/焦轴。9 类 geometry、19 类 constraint、10 类 InternalAlignment 语义由公开常量锁定;新圆锥曲线和 helper geometry 已通过 FCStd 写出、解析和 Web ID 恢复测试。basic TypeScript solver 对尚未求解的圆锥曲线明确返回 unsupported,不伪装成已求解。 新增 `partDesignParameters.ts`,将当前 Facade 支持的 Datum/ShapeBinder、Pad/Pocket、Revolution/Groove、Loft/Pipe、dress-up、transform/pattern 和 Hole 共 21 个 family 建成 202 个属性槽、72 个语义分区的可执行合同。对象创建和属性编辑现在统一检查两侧长度/角度、Midplane 冲突、Up-to-face 引用、自定义向量、Loft section、Pipe spine、Chamfer 模式、pattern occurrence/方向和 Hole cut/thread 组合。经锁定桌面对象探针对账,FreeCAD 实际注册的同名字段进入 FCStd native property 白名单;`AxisLink`、显式方向向量、`ThreadPitch` 等 Web 兼容字段仍按动态属性保存,不冒充原生属性。 新增 `FreeCADPrivateNamingABI v1`:三项 Embind 回调分别报告 ABI version、锁定 FreeCAD 1.1.1/commit/operation 能力,并按 JSON 请求返回命名证据。Direct provider 与 Worker 都传输输入 STEP、最终 STEP/BRep、stage DAG 和 OCCT history;回包必须包含原生/歧义状态、MappedNameRef、StringHasher、ElementMap2,并通过 stage/result 上下文、16/32 MiB 上限、StringID、ElementMap2 和两者引用闭包检查。缺回调、版本/提交不符、operation 未声明或证据不合法均不生成 token,继续保留 `final-shape-only`。 `config/freecad-sketcher-partdesign-abi-contract.json` 与 `check:freecad-sketcher-partdesign-abi` 已进入默认 Sketcher 门禁,Facade 为 `190/190`,独立合同门、Facade boundary、锁定 FreeCAD 原生 FCStd 门和全量 `verify` 均通过。这里完成的是支持范围内的参数合同、FCStd 表面和私有 ABI/传输/验证层;当前随附的 `native/occt-history` 仍未链接 FreeCAD 私有 C++,所以浏览器实时命名实现仍为 `not-linked`。`EX-TSN-02` 由 `pending` 转为 `in_progress`,机器计划为 `2 completed / 37 in_progress / 13 pending / 0 blocked`;`systemExact=false` 和 promotion fail-closed 状态不变。 ## 230. 2026-08-12 Qt6 wasm 前置条件、FreeCAD 私有源码探针与边界门 QtBase 6.8.2 源码包已通过 USTC 国内镜像取得,并用 Qt 发布包官方 SHA-256 `012043ce6d411e6e8a91fdc4e05e6bedcfa10fcb1347d3c33908f7fdd10dfe05` 校验。新增 `build:qt6-wasm-core`,固定 Emscripten 3.1.69,构建静态 wasm32 `Qt6Core`、bundled Pcre2 和 zlib;离线模式只使用本机缓存,缺少已校验源码包时立即失败。源码包、展开源码、可用 SDK 和可选增量构建目录均已纳入项目离线资源清单。 新增的 `build:freecad-naming-source-probe` 并未假装提供生产命名实现。它固定 FreeCAD 1.1.1 提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`,同时校验 `IndexedName.cpp`、`MappedName.cpp`、`StringHasher.cpp` 与 `Base/Handle.cpp` 的逐文件 SHA-256,再把四个原始编译单元与 wasm Qt6Core 编译为独立探针。运行时验证 IndexedName 解析、MappedName 追加/tag 读取、StringHasher 去重、SHA-1 阈值及索引映射名称引用;探针明确检查不导出 `freecadNamingAbiVersion`、`freecadNamingCapabilitiesJson`、`freecadNamingEvidenceJson`。这证明的是锁定 StringHasher 核心源码与工具链可交叉编译和运行,不包含 `ElementMap.cpp`、`MappedElement.cpp`、FreeCADApp/Part 静态库或生产 Worker bridge。 新增 `check:freecad-private-naming-boundary`,跨 ABI 合同、兼容性矩阵和 exact 计划校验同一状态,并接入默认 `verify`、真实 wasm lane 和离线 smoke。准确边界保持不变:随附 OCCT Worker 仍没有链接 FreeCAD 私有 C++ 命名实现,制品仍无三项私有命名回调;`shippedWorkerImplementation=not-linked`、`freecadNamingBuild.status=contract-only`、`EX-TSN-02=in_progress`、`systemExact=false`。本批只完成可离线复现的前置构建和防止状态误提升的机器门禁。 ## 231. 2026-08-12 ElementMap 原始源码 WASM 探针与隔离 ABI 候选 私有命名源码探针现已锁定并直接编译 FreeCAD 1.1.1 的 `IndexedName.cpp`、`MappedName.cpp`、`StringHasher.cpp`、`MappedElement.cpp`、`ElementNamingUtils.cpp`、`ElementMap.cpp` 与 `Base/Handle.cpp` 七个原始编译单元。独立 WASM 实跑覆盖 StringHasher 去重/SHA-1 阈值/索引引用、ElementMap StringHasher 编码、双向查找、历史回溯、保存恢复、MappedElement 排序和 DocumentObject tag;Application/Document 生命周期、持久化流、Python 包装、类型系统和日志只在探针中使用最小宿主适配。 探针现在从真实 `ElementMap::save` 和 `StringHasher::getIDMap` 生成原生资源。ElementMap 保存体按 FreeCAD `ComplexGeoData` 外层协议补入 `BeginElementMap v1` 后,由 Web `parseElementMap2` 读得 `MapCount=1`、4 个名称和 1 个 token;StringHasher schema v2 读得 1 个条目,引用闭包无缺失。三个刻意隔离命名的 `freecadNamingCandidate*` 回调把这些资源送入现有 `probeFreeCadPrivateNamingAbi` 与 `captureFreeCadPrivateNamingEvidence`,严格 Web ABI 校验通过。候选只接受探针 `cut` 协议载荷,没有 OCCT builder context,也不会发布到生产 Worker。 `config/freecad-private-naming-source-readiness.json` 与 `check:freecad-private-naming-boundary` 已把真实源码、运行时断言、宿主适配、隔离候选和生产缺口分别建模;检查器拒绝候选使用生产回调名,并继续要求生产导出列表为空。真实 WASM lane 与离线 smoke 都会重建和执行源码探针及候选 ABI 测试,不允许只读取历史结果。 准确边界保持不变:`native/occt-history` 生产制品未链接探针,也未链接 FreeCADApp/Part/Python 静态库、真实 Application/Document 集成或生产 bridge,三项生产 Embind 命名回调仍不存在。因此 `shippedWorkerImplementation=not-linked`、`freecadNamingBuild.status=contract-only`、`EX-TSN-02=in_progress`、`systemExact=false` 全部保持不变。下一步是生成可审计的 wasm FreeCADApp/Part/Python 静态 SDK,将真实 OCCT builder 阶段历史接入生产 bridge,再对每类 builder 执行命名证据和 FCStd 往返门禁。 ## 232. 2026-08-12 FreeCAD 命名 WASM SDK 差距门与静态归档形态 七个已锁定的 FreeCAD 私有命名编译单元不再直接混入探针最终链接命令,而是分别生成 wasm object,再由 `emar` 封装为隔离的 `libFreeCADPrivateNamingProbe.a`。烟测解析真实 `ar` 成员并确认归档为 900882 bytes、7 个成员、7 个 wasm object、0 个 LLVM bitcode;主探针只从该归档解析命名符号后,StringHasher、ElementMap、MappedNameRef 与 Web ABI 全部断言继续通过。该归档仍使用 Persistence/Python/Application/Document 等宿主适配,机器清单固定 `hostAdapterBound=true`、`productionEligible=false`,不冒充 FreeCADBase/FreeCADApp。 新增 `config/freecad-naming-sdk-plan.json`、`check:freecad-naming-sdk-readiness` 和 `generate:freecad-naming-sdk-manifest`。就绪检查直接解析静态 `ar`,接受 wasm relocatable object/LLVM bitcode,明确拒绝宿主 ELF;当前本机验证 `libQt6Core.a` 为 219 个 wasm object,并验证其 Bundled Pcre2 27 个、Bundled Zlib 15 个实际链接依赖。FreeCAD 私有头与 QtCore 头齐全,但核心五库仅 `QtCore=1/5`,仍缺 FreeCADBase、FreeCADApp、Part、Python 和 production bridge。生成器在任何缺项下都拒绝写 manifest,完整 SDK 检查也复用相同归档目标校验,不允许仅靠文件非空和 SHA-256 混入 x86 库。 readiness 已进入默认 `verify`、真实 WASM 重建 lane 与离线 smoke;候选 SDK 目录要等首个真实 FreeCADBase/Python wasm 归档生成后再加入离线资源库,当前不制造空资源记录。准确边界不变:生产 OCCT Worker 未使用上述探针归档,`availability=unavailable`、`callbacks=[]`;`freecadNamingBuild.status=contract-only`、`EX-TSN-02=in_progress`、`systemExact=false`。下一步仍是获取或构建锁定 Emscripten 3.1.69 的 FreeCADBase/FreeCADApp/Part/Python 静态库,实现真实 Document/OCCT builder bridge 后再做 production artifact probe。 ## 233. 2026-08-13 完整候选 SDK、真实私有命名桥与隔离 Worker 候选 SDK 已从差距门推进为完整可校验闭包。FreeCADBase、FreeCADApp、Part、QtCore 和 CPython 3.13 五个核心 wasm 静态库全部通过 `ar` 成员目标检查;21 个链接依赖包含 Qt/ICU/Xerces/Boost/yaml-cpp 以及 CPython 实际拉入的 mpdecimal、expat、HACL SHA2、zlib、bzip2、sqlite3。CPython 构建固定 `SOURCE_DATE_EPOCH`,显式生成 `pybuilddir.txt` 和 wasm stdlib;连续两次构建得到相同的 `libpython3.13.a` 与 `python313.zip` 哈希。manifest 现在同时哈希 bridge、host adapter、force-include 头和 Python 运行时文件,并固定 C++20、pthread 和四项兼容宏,缺任一项都拒绝生成或加载。 新增真实隔离 bridge,不再依赖探针 shims。它初始化 FreeCAD `App::Application`,直接调用锁定 1.1.1 的 `ElementMap::encodeElementName/setElementName/beforeSave/save`、`MappedName` 和 `StringHasher`,导出三项版本化 ABI。Node 实跑验证首阶段 postfix、链式 `$#id:index`/3 项 StringHasher 闭包,以及缺 history 的结构化 fail-closed;JS/WASM/DATA 的哈希证据写入本机候选报告,且明确 `productionPublication=false`。 SDK-05 又建立了独立 pthread OCCT 构建和 `.cache/candidates/freecad-naming-worker` 候选模块。Node 与 Chrome 均在同一个 wasm 中先执行 OCCT 8.0.0 cut history,再调用 FreeCAD 私有命名 ABI;Chrome 在 COOP/COEP 隔离环境中验证三回调、链式 StringHasher 闭包和无 history 拒绝。执行命令与只读报告检查已拆分,检查器会重新计算当前 JS/WASM/DATA 哈希,静态旧报告不能替代真实 harness。本批 WBS 为 SDK-01/02A/02B/03/04/05 completed,PAR-01 in_progress。 候选桥随后补齐非空 StringHasher 的下一阶段恢复。它只接受 schema/nativeVersion 正确、ID 连续有序、依赖只指向既有 ID、能够由 FreeCAD 公共 `StringHasher` API 逐字段重建的表;二进制/单向哈希、缺表、ID 篡改和多输入不一致表继续 fail-closed。隔离桥、合并 Worker 和真实 Chrome 都执行三阶段链,条目数为 `0→3→5`;隔离负例确认篡改 ID 与不一致表均被拒绝。该能力仍仅存在于候选目录,未发布到生产 Worker。 准确生产边界没有改变:候选构建强制 `OCCT_HISTORY_PUBLISH=0`,没有覆盖仓库随附的 `native/occt-history` 或 `public/native/occt-history`。因此生产 `availability=unavailable`、`callbacks=[]`、`shippedWorkerImplementation=not-linked`、`freecadNamingBuild.status=contract-only`、`EX-TSN-02=in_progress`、`systemExact=false` 继续成立。下一项是 PAR-01:扩展 Datum/Attachment/ShapeBinder、多 Body、完整参数 mutation/编辑恢复/FCStd 往返,并在覆盖每类 builder 后才评估生产发布。 ## 234. 2026-08-13 PAR-01 首批 Datum/Binder/多 Body 原生结构 oracle 新增 `freecad-partdesign-structure-oracle`,直接在锁定 FreeCAD 1.1.1 中创建四个 Body、Plane/Line/Point 三类 Datum、ShapeBinder 与 SubShapeBinder。初始证据锁定 SourceBody.Tip=SourceBox,而只包含 Datum 或 Binder 的三个 Body.Tip 均为 null;这些非实体对象不会错误接管 Tip。DatumPlane 使用 XY_Plane/FlatFace 与 Z=5、绕 Z 30° 的 AttachmentOffset,DatumLine/Point 分别使用 ObjectX/ObjectOrigin;四个 Body 的 Group 顺序均被采集。 源 AdditiveBox 的 Length 编辑使体积 `480→672`,跨 Body ShapeBinder 同步 `480→672`;选定 Edge1..4 的 SubShapeBinder 长度保持 28。DatumPlane offset 编辑为 Z=7/45° 后,其实际 Placement 同步更新。另建 `Face999` 支撑的 DatumPlane,FreeCAD 明确返回 `Touched + Invalid` 与 `AttachEngine3D: subshape not found SourceBox.Face999`,没有把坏引用静默重绑。 该文档真实保存为 FCStd、关闭、重新打开并重算;四个 Body 的 Group/Tip、Datum 支撑/MapMode/Offset、两类 Binder 引用与形状、无效支持诊断全部保持。执行与检查命令已分离为 `probe:freecad-partdesign-structure` 和 `check:freecad-partdesign-structure`,并纳入真实 oracle lane 和默认 Sketcher/PartDesign 门禁。 同一 oracle 又增加双 FCStd 跨文档场景。原生 `ShapeBinder.Support` 虽报告为 `App::PropertyLinkSubListGlobal`,但直接赋外部文档对象仍明确返回 `PropertyLinkSubList does not support external object`;`SubShapeBinder.Support` 为 `App::PropertyXLinkSubList`,在源/消费文档均已落盘后接受 `ExternalBox.Face1`。关闭并按源→消费顺序重开后 XLink 仍指向源文档,源 Width 编辑使 Face1 与 SubShapeBinder 面积同步 `30→48`。删除源对象时 FreeCAD 清空 XLink,但保留面积 48 的最后形状缓存,且状态仍为 `Up-to-date/Valid`;检查器锁定了这一非直觉生命周期语义。本节完成时 EX-PD-02 仍为 pending;第 236 节已补齐当时剩余的完整 Attachment 组合、其他 XLink/重新链接恢复与 Web Chrome 生命周期。 ## 235. 2026-08-13 PAR-01 Attachment 注册表与引擎分区 oracle 新增独立 `freecad-attachment-mode-oracle`,从锁定 FreeCAD 1.1.1 运行时读取 `MapMode` 的永久枚举顺序和 `Attacher` 元数据。真实注册表为 55 项;Plane 与 Sketch 的 `AttachEnginePlane` 各实现 23 项,Line 的 `AttachEngineLine` 实现 18 项,Point 的 `AttachEnginePoint` 实现 9 项,实现并集为 50 项。`Deactivated` 是关闭状态,`TangentU`、`TangentV`、`IntersectionPoint`、`MidPoint` 未出现在这四类引擎的实现集合。报告为每个实现模式保留永久索引和完整 `ReferenceCombinations`,从而将“枚举可写”与“当前引擎实际实现”分开。 代表性执行场景覆盖 Plane/Sketch 的 `FlatFace`、Line 的 `TwoPointLine` 和 Point 的 `Vertex`,并锁定引用类型建议、Placement、状态与 `positionBySupport`。源 Box 高度从 6 改为 9 后,Vertex Point 的 Z 同步 `6→9`;FCStd 关闭重开后保持。反向案例证明 Plane 写入 `Vertex`、Line/Point 写入 `FlatFace` 虽能保留枚举,却都进入 `Touched + Invalid` 并返回 `Attachment mode ... is not implemented.`,且失败状态同样通过 FCStd 往返。新执行/检查命令已进入真实 oracle lane、Sketcher/PartDesign 聚合门禁及 PAR-01 证据。本节登记的剩余项已由第 236 节关闭。 ## 236. 2026-08-13 EX-PD-02 Attachment/XLink/重连与 Chrome 生命周期闭合 新增 `freecad-attachment-combination-oracle`,不再把 50 个实现模式的注册表元数据当作执行覆盖。锁定 FreeCAD 1.1.1 为 Plane、Sketch、Line、Point 四类对象逐项展开每个 `ImplementedModes` 的全部 `ReferenceCombinations`,形成 `85 + 85 + 44 + 22 = 236` 个执行槽位。每个槽位使用独立 Box、平面、直线、圆、椭圆、双曲线、抛物线、一般曲线和顶点几何;初始状态均为 `Up-to-date/Valid`,`suggestModes` 接受目标模式且 Placement 有限。所有源几何统一平移 `(1.25,-0.75,2)` 后,236 个 Placement 逐轴同步;保存 FCStd、关闭并重开后,支持引用、位置、旋转轴和角度均无漂移。`probe:freecad-attachment-combinations` 负责真实执行,`check:freecad-attachment-combinations` 只检查当前报告,两者已纳入真实 oracle lane。 新增 `freecad-xlink-relink-oracle` 覆盖 `App::PropertyXLink`、`App::PropertyXLinkSub`、`App::PropertyXLinkList` 和 `App::PropertyXLinkSubList`。原生 FreeCAD 要求外链所有者先保存;四类属性标志均为 `21`。源文档关闭或源 FCStd 临时移走时,Python 可见链接清空,而 SubShapeBinder 保留最后面积 30 的有效缓存;源文件恢复原路径并重新打开后,四类链接与 Binder 支持自动恢复。恢复后 SourceBox `Length/Width` 与 SecondBox `Height` 编辑通过四类属性传播,Binder Face1 面积从 `30→54`;源和消费文档再次保存、关闭、按序重开后仍保持。真实执行与检查命令为 `probe:freecad-xlink-relink` 和 `check:freecad-xlink-relink`。 Web 新增独立 `ExternalPartDesignLinkRegistry`,按原生状态建模四类外链、`open/closed/missing`、状态标志 `21`、Binder 最后形状缓存、同 document id/同路径重连以及可序列化 undo/redo。真实 Chrome harness 在 COOP/COEP 隔离环境中由 OCCT Worker 创建两代四个 Box,以质量属性校验尺寸和面积;随后通过 OPFS 保存 missing 状态、重开、重连、编辑、undo/redo、再次保存并验证重开后的历史栈。结束时 OPFS 证据目录删除,ShapeHandle 与 kernel reference 均为 `0/0`。执行与静态检查分别为 `test:chrome-partdesign-reference-lifecycle` 和 `check:chrome-partdesign-reference-lifecycle`,已进入默认 `verify`、Chrome execute/check lane 和 PartDesign 聚合闭合门。 因此 `PAR-01=completed`、`EX-PD-02=completed`,exact 计划为 `3 completed / 37 in_progress / 12 pending / 0 blocked`。该关闭只对应 Attachment、Datum、Binder、多 Body 与跨文档引用的已定义验收范围;更大的 `EX-PD-01` 和 `EX-DOC-04` 仍按各自全 TypeId/全多文档范围保持开放。准确生产命名边界未改变:`availability=unavailable`、`callbacks=[]`、`shippedWorkerImplementation=not-linked`、`freecadNamingBuild.status=contract-only`、`EX-TSN-02=in_progress`、`systemExact=false`。 ## 237. 2026-08-13 EX-TSN-02 生产 FreeCAD 私有命名 Worker 链接闭合 生产 `native/occt-history` 已改为强制读取完整 FreeCAD wasm SDK manifest,并把锁定 FreeCAD 1.1.1 的 FreeCADBase、FreeCADApp、Part、Qt/Python 依赖和真实 `ElementMap/MappedName/StringHasher` bridge 链接到 OCCT Worker。默认 `build:occt-history` 必须同时满足 `FREECAD_WASM_NAMING_REQUIRED=1` 和 `OCCT_HISTORY_PUBLISH=1`;缺 SDK 或哈希不一致会直接失败。OCCT-only 构建被拆为不发布的 `build:occt-history-only-candidate`,不能覆盖生产路径。 新增共享 19-operation 生产矩阵,覆盖 Fuse/Cut/Common、Rotate、Pad/Pocket、Loft/Pipe、Revolution/Groove、Fillet/Chamfer/Hole/Draft/Thickness 以及 Linear/Polar/Mirrored/MultiTransform。Node 与真实 Chrome 均从已发布生产模块执行实际 OCCT builder history,再调用 `freecadNamingAbiVersion`、`freecadNamingCapabilitiesJson`、`freecadNamingEvidenceJson`。第 238 节进一步修正了本段最初按结果“取第一条”的错误统计:当前 17 类样本具有至少一个唯一来源并实际执行 C++ 回调,Loft/Pipe 为全歧义来源而不调用私有 token 生成;链式 Cut 仍将 StringHasher 扩展到 3 项,缺失 history 继续结构化拒绝。两份报告同时锁定生产 JS/WASM/DATA 和共享 harness SHA-256;执行命令与静态 check 分离,旧报告不能替代实时 Chrome。 命名传输现在只保留能解析到外部 `inputId/role` 的历史来源,C++ bridge 继续严格拒绝未知来源,不再把内部 builder 形体冒充为外部输入。Node 与 Chrome 报告逐项记录 `externallySourcedRecords/internalRecordsExcluded`:Hole 排除 15 条内部圆柱记录;LinearPattern、PolarPattern、Mirrored 分别排除内部复制体记录。双输入 Boolean/Loft/Pipe 的独立 tool 输入仍完整保留。相同结果的关系现在先按 provenance 分组:同一来源的重复关系折叠,唯一来源才进入严格 ElementMap,多来源保留候选集,绝不再依赖数组顺序。 离线资源仍以 `native/occt-history/dist` 为唯一归档源;新增 `publish:occt-history` 在离线恢复后先实例化并校验锁定 ABI,再同步 JS/WASM/DATA 到 public。真实 WASM lane 负责重建生产链接并执行 Node 矩阵,Chrome lane 自动执行实时生产矩阵并在 check 阶段只读校验报告。 因此当前准确边界为 `availability=available`、三项生产回调齐全、`shippedWorkerImplementation=freecad-linked`、`freecadNamingBuild.status=production-linked`、`EX-TSN-02=completed`。本节当时 exact 计划为 `4 completed / 36 in_progress / 12 pending / 0 blocked`;第 238 节已关闭非唯一同构来源任务。`systemExact=false` 保持不变。 ## 238. 2026-08-14 EX-TSN-03 同构 provenance 与原生属性缺口量化 生产命名入口不再按 `resultKind/resultIndex` 选择首条历史。新的 provenance 分类器将每个结果按来源对象、来源持久名、来源 stage 和关系分组;只有唯一来源进入 FreeCAD 私有 C++ 命名,多个原生来源则生成 `ambiguous` MappedNameRef 并完整保留候选集。若上游结果已经歧义,下游特征会展开上游候选而不是把中间对象的 `FaceN` 重新稳定化;部分 ElementMap 未覆盖但当前 Shape 合法存在的子形状使用普通 indexed `FaceN/EdgeN/VertexN` 作为输入 fallback,不制造私有 token。 Node 与真实 Chrome 的 19-operation 生产矩阵均重跑通过。17 类样本存在唯一来源并执行 C++ 回调;Loft 和 Pipe 的当前样本全部为多来源,明确走 ambiguity-only 路径。完全重合的两个等尺寸 Box 做 Common 产生 `26` 个歧义结果,候选数均不少于 2,`arrayOrderFallbackUsed=false`。独立 Facade harness 通过真实 `DirectNativeOcctHistoryProvider` 和生产 Worker 验证:对称 Common 为 `26 ambiguous / 156 candidates`,混合 Cut 为 `3 stable + 9 ambiguous`,下游 Rotate 为 `9 stable + 35 ambiguous / 135 candidates`,候选对象仍包含原始 `cut-object` 和 `cut-tool`。JSON 持久化保持候选集;已有 Facade 事务测试继续覆盖显式选择、undo/redo 和重算。通用 FCStd `PropertyLinkSub/PropertyLinkSubList` 写出同时改为 fail-closed,结构化 TopoRef 必须为 stable、对象一致且是无损原生 `FaceN/EdgeN/VertexN`。 原生属性语义新增独立 probe/check。锁定 FreeCAD 1.1.1 的 `Document.supportedTypes` 实跑为 `352` 个注册对象类型、`348` 个可实例化对象、`4` 个明确不可实例化对象,以及 `85` 种属性类型/`5510` 条属性记录。当前原生可编辑 codec 覆盖 `18` 种/`4135` 条,Sketch/Shape/Path/Expression 等专用 codec 覆盖 `5` 种/`683` 条;剩余 `62` 种/`692` 条仍只能 opaque FCStd proxy。观察到 15 类属性状态,其中 Facade 目前只原生表达 Hidden/ReadOnly;`2639` 条记录包含其余 13 类状态语义。报告将原始数字位 13、22-27 按锁定 FreeCAD `Property::Status` 映射为 Ordered 与 Prop* 名称,未知数字位为 0。 因此 `EX-TSN-03=completed`、`EX-TSN-04=in_progress`,exact 计划为 `5 completed / 36 in_progress / 11 pending / 0 blocked`。准确边界为 `availability=available`、三项生产回调齐全、`shippedWorkerImplementation=freecad-linked`、`freecadNamingBuild.status=production-linked`、`systemExact=false`。剩余系统阻断现为两项:穷尽跨特征命名/原生 FCStd save-reopen-resave 语料,以及完整原生文档、属性类型、状态、editor 与生命周期语义。 ## 239. 2026-08-14 EX-TSN-04 五阶段生产命名链 同构 provenance harness 已从 Cut→Rotate 扩展为生产 OCCT Worker 实际执行的 Cut→Rotate→Fillet→Mirrored→LinearPattern 五阶段链。每一阶段的 `NativeStageNamingEvidence` 都先经过 JSON 保存/恢复,再作为下一阶段输入;五阶段分别产生 `42/135/261/326/1090` 条原生历史关系,stable/ambiguous 映射为 `3+9`、`9+35`、`9+35`、`11+40`、`55+89`。后四阶段均有 ElementMap2,StringHasher 条目单调增长 `0→3→6→9→17`。 候选传播门禁不再错误要求每个下游结果永久携带所有祖先对象,而是按当前原生历史实际引用的上游 `kind/sourceIndex` 计算必需候选集合。Rotate、Fillet、Mirrored 和 LinearPattern 所引用的候选对象均完整出现在下游 ambiguity evidence 中;若某阶段没有引用某个祖先歧义子形,则不凭空复制该候选。这一规则同时防止候选丢失和历史污染。 同一 harness 还补充 Web FCStd LinkSub 持久化边界:stable、对象一致的 `Face1` 经写入、inspect、rewrite、再 inspect 后仍为 `Face1`;ambiguous TopoRef 继续 fail-closed。该证据未执行 FreeCAD 桌面端 save-reopen-resave,报告明确记录 `nativeDesktopResaveCovered=false`。因此 `EX-TSN-04=in_progress`、任务计数和 `systemExact=false` 均不变;剩余命名阻断仍是穷尽类型兼容的跨特征转换矩阵,以及完整原生 FreeCAD FCStd 往返语料。 ## 240. 2026-08-14 原生复合模型二次 FCStd resave 门 扩展 `freecad-composite-history-elementmap-oracle` 的每个 30-case 流程:初次保存后关闭并重开,采集 ElementMap/`getElementMappedName()`;随后再次 `saveAs()`,再次关闭并重开,再采集同一组阶段和子形名称。报告新增 `nativeDesktopResaveCovered`、`resaveNameDrift` 及汇总计数,检查器要求 30/30 案例完成二次原生保存且 `roundtripNameDrift=0`、`resaveNameDrift=0`。 本轮实际结果为 30 个案例、219 个阶段、91 个 ElementMap2 资源和 11 个 StringHasher 资源全部通过;二次保存后的命名漂移为 `0`,`wrongBindings/unexplainedRelations/roundtripNameDrift` 等 exact gate 指标继续为零。EX-TSN-04 已把该门禁登记为证据,但仍保持 `in_progress`:生产 Worker 五阶段链与桌面 30-case 语料尚未完成逐阶段相关性对账,跨特征 mutation 矩阵也未穷尽。完整 `./npmw run verify`、构建、签名发布和 `git diff --check` 均通过。 ## 241. 2026-08-14 EX-TSN-04 桌面五阶段关联与跨特征 mutation 门 新增锁定 FreeCAD 1.1.1 的 `freecad-tsn-stage-correlation-oracle`,按生产顺序执行 Cut→Rotate→Fillet→Mirrored→LinearPattern,采集每阶段 Shape、MappedName 摘要、`getElementHistory()` 来源图,并完成关闭、重开、二次 `saveAs()`、再次重开。该专用链与原 30-case corpus 合计形成 31 个桌面 resave 用例;新增链的 `wrongBindings=0`、`unexplainedRelations=0`、`roundtripNameDrift=0`、`resaveNameDrift=0`。exact history gate 现正式计入 `resaveNameDrift`,不再只检查首次 round-trip。 跨特征 mutation 对五个阶段各执行一次参数编辑、全链重算和恢复,5/5 参数与几何恢复通过;现有 35-family 报告能为 Cut、Fillet、Mirrored、LinearPattern 提供独立原生 mutation,对 Rotate 仍无注册 feature family。FreeCAD 的顺序 PartDesign 链拒绝继续变换 Mirrored 输出,原生错误为 `Only additive and subtractive features can be transformed`,因此专用顺序链的 Rotate、Mirrored、LinearPattern 仍只能标记为通用 Shape 代理,不能算原生 builder。Cut 与 Rotate 的恢复还导致 2/5 用例、5 个下游语义拓扑摘要变化,虽未形成错误绑定,仍阻断 exact。 新门禁将 19 类生产 operation 展开为 361 个有序组合;当前真实回放 4 个相邻转换,剩余 357 个尚未完成类型兼容分类。`EX-TSN-04` 因此保持 `in_progress`,机器化剩余量为 `native sequential builder=2/5`、`native mutation correlation=4/5`、`classified transition=4/361`。不得用当前零漂移结果越过这些显式阻断。 ## 242. 2026-08-14 30-case 逐阶段 mutation 与恢复对账 `freecad-composite-history-elementmap-oracle` 已为固定的 `9 Boolean + 11 PartDesign + 6 复合 Boolean + 4 dress-up` 构造器增加逐案例 mutation 合同。Boolean 编辑 Cylinder.Radius,PartDesign 编辑 Pad.Length,复合 Boolean 编辑第一层基体 Box.Length,Fillet/Chamfer 分别编辑 Radius/Size;每个目标均由 FreeCAD 报告为原生可编辑 Property,并必须改变最终对象的解析几何摘要。采集器为 219 个阶段各保存 before/edited/restored 三相记录,共 657 条,包含稳定解析几何 digest、B-Rep SHA-256、relation digest 与 semantic-name digest。 锁定 FreeCAD 1.1.1 oracle 实跑为 `30/30 mutation pass`、最终传播失败 `0`、几何恢复失败 `0/219`。恢复后的文档状态作为实际 FCStd nominal 基线,再执行 save/reopen/resave;30/30 case、219/219 阶段保持 `roundtripNameDrift=0` 与 `resaveNameDrift=0`,91 个 ElementMap2 和 11 个 StringHasher 资源继续通过解析、写回与语义检查。恢复重算本身仍使 11 个 PartDesign case 的 28 个阶段产生 relation/semantic-name digest 演进;报告与 exact gate 将其作为独立非零指标保留,未把几何恢复等同于命名 exact。 新增共享 `freecad-composite-mutation-evidence` 校验器,锁定 30 个 case identity、四类配额、原生 Property/editor 状态、target/final stage ordinal、三相阶段 identity、最终传播和逐阶段恢复。TSN-04 checker 与 exact history gate 都按 case 一对一连接 resave 证据,任一案例缺失、重复、错序或局部指标不一致即失败。FreeCAD 来源子形解析同时覆盖 `FaceN/EdgeN/VertexN`、`#d:1`、`#42` 和 `g1v2;SKT` 原生语法;当前 `wrongBindings=0`、`unexplainedRelations=0`。`EX-TSN-04` 仍为 `in_progress`:除 28 个恢复命名摘要演进外,五阶段链仍有 3/5 proxy、rotate mutation family 缺失、5 个拓扑恢复 drift 和 357 个未分类 operation pair。 ## 243. 2026-08-14 执行重审与首个 GUI 成功工作流 新增 `freecad-web-execution-master-plan.zh-CN.md`,重新区分 83/83 兼容任务与 5/52 exact 任务,按 ORA、TSN、Property、Document、Kernel、Sketcher、Part、PartDesign、FCStd、GUI、工程工作台、平台和发布拆出最小 A-I 验收步骤。机器队列继续保持 `maxInProgress=1`,不以文档计划替代原生和浏览器证据。 `ORA-GUI-WF-000` 选择 `partdesign-pad-task`,代表命令为 `PartDesign_Pad`,主 exact 映射为 `EX-UI-03`,关联 `EX-ORA-01/EX-PD-01`。选择依据、成功/禁用/失败/取消/恢复配方和串行进度保存在 `config/freecad-gui-workflow-plan.json`,新增 check 保证命令敏感度与 1111 命令运行时清册一致。 `ORA-GUI-WF-001` 随后在隔离 Xvfb 的锁定 FreeCAD 1.1.1 桌面进程真实执行。原生命令从已选矩形 Sketch 打开 Pad Task,TaskView 的实际接受按钮为 `Done`;接受并清理 edit 状态后得到 `PartDesign::Pad`,Body Group 为 `Sketch,Pad`、Tip=Pad、Profile=Sketch、Length=10,实体为 6 面/12 边/8 点、体积 120、状态 Up-to-date,UndoCount=1。报告只声明 success,remainingStates 仍为 disabled/failure/cancel/recovery。队列前移为 112 completed、1 in_progress、374 pending,唯一下一项是 `ORA-GUI-WF-002`。 本轮完整 `./npmw run verify` 以退出码 0 完成,生产构建、79 个签名发布文件、34 模块 release closure 和 Ed25519 验签通过;能力矩阵仍准确保持 0 exact、26 compatible、5 proxy、3 development。 ## 244. 2026-08-14 ORA-GUI-WF-002 Pad 无文档禁用工作流 Pad GUI oracle 现以两个独立的隔离 Xvfb/FreeCAD 1.1.1 进程采集 success 与 disabled 状态。disabled 进程激活 Part Design 工作台但不创建文档,原生 `PartDesign_Pad` 的 `isActive()` 与 QAction `isEnabled()` 均为 false;对 disabled QAction 调用 `trigger()` 不产生 triggered 信号,直接调用 `Gui.runCommand("PartDesign_Pad")` 也被命令管理器的 `isActive()` 门阻止。 两条激活入口前后均采集应用文档集合、活动 App/Gui 文档、选择、`Gui.Control.activeDialog()`、编辑对象、全局 active transaction 与逐文档 Undo/Redo 作用域。实际结果始终为 0 个文档、无活动 Task/edit、无全局事务且无文档事务作用域;聚焦 checker 对四个前后快照 fail-closed。`ORA-GUI-WF-002` 已关闭,队列前移为 113 completed、1 in_progress、373 pending,唯一下一项是 `ORA-GUI-WF-003` failure 工作流。 本轮聚焦原生 probe/check、工作流计划、PartDesign Chrome 生命周期、Facade 测试和 `check:execution-plan` 均通过;完整 `./npmw run verify` 也以退出码 0 完成,包含生产构建、79 个签名发布文件、34 模块 release closure 与 Ed25519 验签。 ## 245. 2026-08-14 ORA-GUI-WF-003 Pad 原生失败工作流 Pad GUI oracle 新增隔离的 failure 进程:活动 Body 中选择由两条线段构成的 open-wire Sketch,原生命令创建 `PartDesign::Pad` 无效预览并保持 Pad Task 打开;点击接受后捕获 FreeCAD `Input error` 对话框及精确诊断 `Wire is not closed.`。诊断关闭后 Task、活动事务和无效预览仍保留,可继续修正参数。 失败态采集完成后仅执行 Task reject 做资源清理;临时 Pad 被删除,活动事务归零,Body Tip、原始对象全集、Sketch 两条几何、Shape 有效性和文档基线均恢复。聚焦 checker 对诊断、失败保留态与清理回滚逐项 fail-closed。`ORA-GUI-WF-003` 已关闭,队列前移为 114 completed、1 in_progress、372 pending,唯一下一项是 `ORA-GUI-WF-004` cancel 工作流。 ## 246. 2026-08-14 ORA-GUI-WF-004 Pad 原生取消工作流 cancel 进程从闭合 4x3 Sketch 打开 Pad Task,将 Length 改为 17.5 mm,并确认预览为体积 210 的有效单实体、Body Tip 临时指向 Pad 且 `Make Pad` 事务处于活动状态。Task reject 后临时 Pad 被删除,Body Tip 与对象全集恢复,活动 Body 保持为 Body,Sketch 的四条几何、Shape 有效性和可见性均保持,事务与 Undo/Redo 作用域归零。 原生结果纠正了预写配方中的两项假设:Sketch 选择在命令启动时被消费为空,取消后不恢复;焦点由 3D View 进入 `lengthEdit`,取消后落在 TaskView,也不返回原 3D View。配方和 checker 已按实际 FreeCAD 1.1.1 三阶段轨迹 fail-closed。`ORA-GUI-WF-004` 已关闭,队列前移为 115 completed、1 in_progress、371 pending,唯一下一项是 `ORA-GUI-WF-005` recovery 工作流。 ## 247. 2026-08-14 ORA-GUI-WF-005 Pad 原生恢复工作流 recovery 进程从两段 open-wire Sketch 启动 Pad,首次接受捕获 `Input error: Wire is not closed.`,同时保持无效 Pad、`Make Pad` 事务和 Task 可修正状态。同一 Task 内补齐另外两条边,并通过 FreeCAD `Gui::PrefQuantitySpinBox` 的 `rawValue` 属性把 Length 输入为 12 mm;预览和提交均为 6 面/12 边/8 点、体积 144 的有效单实体,Body Tip=Pad、Profile=Sketch、状态 Up-to-date。 提交后的 Undo 恢复到原始两段 open-wire、删除 Pad 并产生 Redo;Redo 恢复四段闭合 Sketch 与 12 mm Pad。随后 FCStd 保存、关闭重开、再次保存、再次关闭重开均保持 Length=12、体积 144、Body Group=`Sketch,Pad` 和 Tip=Pad。原生探针还纠正了预写控件类型假设:`lengthEdit` 不能按标准 `QDoubleSpinBox` 驱动,必须使用自定义控件的 double 型 `rawValue` Qt 属性。`ORA-GUI-WF-005` 已关闭。 ## 248. 2026-08-14 ORA-GUI-WF-006 Pad 工作流门禁收口 工作流计划现为 7/7 completed;checker 同时锁定 success、disabled、failure、cancel、recovery 五态和三阶段持久化精确键集合,不再依赖 JSON 对象序列化顺序。`EX-ORA-01` 与 `EX-UI-03` blocker 已同步为“首个 Pad 命令族完整、其他命令族仍开放”,系统 exact 继续为 false,模块能力仍为 0 exact、26 compatible、5 proxy、3 development。 活动队列前移为 117 completed、1 in_progress、369 pending,唯一下一项为 `TSN-DRIFT-000`,即只解释 `partdesign-plain` 的恢复命名演进。原生 probe/check、工作流计划、Facade 199/199、Chrome PartDesign 生命周期、执行计划和活动队列检查均通过;完整 `./npmw run verify` 以退出码 0 完成,生产构建、79 个签名发布文件、34 模块 release closure 和 Ed25519 验签通过。 ## 249. 2026-08-15 TSN-DRIFT-000 Plain Pad 恢复命名分类 新增恢复命名分类证据链,以现有锁定的 FreeCAD 1.1.1 composite oracle 为参考,再独立运行一次相同原生 30-case harness。`partdesign-plain` 编辑 `Pad10.Length` 的轨迹为 `7 -> 7.75 -> 7`;Body10 与 Pad10 两个受影响阶段的几何摘要在恢复后与初值完全一致,但 relation/semantic-name 摘要从首次创建态演进到新的恢复态。参考运行和独立复跑的 before/edited/restored 三相摘要逐项一致,恢复态又与保存前 nominal 一致,并在 save/reopen/resave 三态保持不变。 该差异因此分类为 `allowed_evolution`,不是 Web 实现缺陷。机器报告 `config/freecad-recovered-naming-classification.json` 固定原生 harness 的 bytes/SHA-256、两次运行证据、漂移 ordinal 和唯一分类;`check:freecad-recovered-naming-classification` 对当前 composite/resave 报告重新推导全部摘要并 fail-closed。分类同时进入 TSN stage correlation blocker 与 `check:execution-plan`。 活动队列前移为 118 completed、1 in_progress、368 pending,唯一下一项为 `TSN-DRIFT-001`,即只解释 `partdesign-midplane` 的恢复命名演进。`EX-TSN-04` 仍为 in_progress:11 个 PartDesign case/28 个恢复命名阶段中只关闭 1 个 case/2 个阶段,剩余 10/26,系统 exact 与模块等级均不提升。 ## 250. 2026-08-15 TSN-DRIFT-001 Midplane Pad 恢复命名分类 `partdesign-midplane` 在锁定 FreeCAD 1.1.1 中编辑 `Pad11.Length`,属性轨迹为 `8 -> 8.75 -> 8`。Body11 与 Pad11 两个漂移阶段的 geometry digest 恢复后与初值完全一致,relation/semantic-name digest 则从首次创建态演进到新的恢复态。锁定参考报告与第二次独立原生复跑的 before/edited/restored 三相摘要逐项一致;恢复态与保存前 nominal 一致,并在 save/reopen/resave 三态保持不变。 该差异因此分类为 `allowed_evolution`,`implementationDefect=false`。连续决策表现包含 `TSN-DRIFT-000..001` 两个且无未知分类;聚焦 checker 对两个 case 的属性恢复、几何恢复、命名演进、nominal 对齐、持久化稳定和独立复跑一致性 fail-closed。 活动队列已机器前移为 119 completed、1 in_progress、367 pending,唯一下一项为 `TSN-DRIFT-002`,即只解释 `partdesign-reverse` 的恢复命名演进。`EX-TSN-04` 仍为 in_progress:11 个 PartDesign case/28 个恢复命名阶段中已关闭 2 个 case/4 个阶段,剩余 9/24,系统 exact 与模块等级均不提升。 本轮聚焦分类、30-case composite、TSN correlation、exact history、执行计划与队列门禁均通过;完整 `./npmw run verify` 以退出码 0 完成,包含 199 项 Facade 测试、生产构建、79 个签名发布文件、34 模块 release closure 和 Ed25519 验签。验证后 `git diff --check`、310 个 JSON 解析与发布产物一致性复核再次通过。 ## 251. 2026-08-15 计划重审与 TSN-DRIFT-002 Reverse Pad 恢复命名分类 执行总计划新增可机器核对的完成度仪表盘,重申 83/83 兼容实现不等于 exact;当前 exact 仍为 5/52,34 模块仍为 0 exact、26 compatible、5 proxy、3 development。TSN 恢复漂移队列已将 11 个 PartDesign case 全部锁定到具体 target property、before/edited/restored 值、drift ordinal 和阶段数;每个 case 再按 contract、独立复跑、三摘要指纹、几何恢复、持久化和唯一决策拆为 A-F 六个最小检查点。 `partdesign-reverse` 在锁定 FreeCAD 1.1.1 中编辑 `Pad12.Length`,属性轨迹为 `5 -> 5.75 -> 5`。第二个独立原生进程再次完成 30/30 case;Body12 与 Pad12 的 geometry digest 在恢复后与 before 精确一致,relation/semantic-name digest 则演进到 restored/nominal 状态。锁定参考与独立复跑的 before/edited/restored 三相指纹逐字段一致,且演进值在 save/reopen/resave 三态中不再变化。 该差异因此唯一分类为 `allowed_evolution`,`implementationDefect=false`。分类账本现包含连续前缀 `TSN-DRIFT-000..002`,共 3 case/6 stage,剩余 8 case/22 stage。队列生成器已自动前移为 120 completed、1 in_progress、366 pending,唯一后继为 `TSN-DRIFT-003 partdesign-taper`;系统 exact 与模块等级均不提升。 ## 252. 2026-08-15 TSN-DRIFT-003 Tapered Pad 恢复命名分类 `partdesign-taper` 在锁定 FreeCAD 1.1.1 中编辑 `Pad13.Length`,属性轨迹为 `6 -> 6.75 -> 6`。第二个独立原生进程再次完成 30/30 case;Body13 与 Pad13 的 geometry digest 在恢复后与 before 精确一致,relation/semantic-name digest 则演进到 restored/nominal 状态。锁定参考与独立复跑的 before/edited/restored 三相指纹逐字段一致,且演进值在 save/reopen/resave 三态中不再变化。 该差异因此唯一分类为 `allowed_evolution`,`implementationDefect=false`。分类账本现包含连续前缀 `TSN-DRIFT-000..003`,共 4 case/8 stage,剩余 7 case/20 stage。队列生成器已自动前移为 121 completed、1 in_progress、365 pending,唯一后继为 `TSN-DRIFT-004 partdesign-twoside`;`EX-TSN-04` 仍为 in_progress,系统 exact 与模块等级均不提升。 本轮聚焦 composite、TSN correlation、exact history、生产命名与 199 项 Facade 测试均通过;完整 `./npmw run verify` 以退出码 0 完成,包含 5000 个确定性 fuzz 样本、生产构建、79 个签名发布文件、34 模块 release closure 和 Ed25519 验签。 ## 253. 2026-08-15 TSN-PAIR fuse->rotate 跨族分类 有序操作对执行器已从 Boolean 后继扩展到单输入 Rotate。第二阶段直接调用生产 OCCT WASM 的 `rotateHistoryFromStep`,报告锁定 `historyProvider=occt-native`、`builder=BRepBuilderAPI_Transform` 与 `inputCount=1`;Rotate 名义态采集 187 条 transform history,分类为 11 个稳定结果与 49 个歧义结果,上游 Fuse 的候选 provenance 通过生产 `nativeNamingAbi` 路径继续传播。 Rotate 使用只编辑第二操作的角度轨迹 `15 -> 22.5 -> 15`。22.5 度阶段改变包围盒,恢复后 Shape 摘要、原生 history SHA-256 与语义命名 SHA-256 精确回到 15 度基线;最终 Shape 和 23836 字节命名证据在 FreeCAD 1.1.1 的 save/reopen/resave 三态保持稳定。检查器同时锁定执行器自身、命名矩阵、FCStd resave harness 与三项 OCCT 产物的 bytes/SHA-256,防止旧报告通过。 `fuse->rotate` 因此以 accepted 关闭。TSN correlation 当前覆盖 8/361 对,剩余 353 对;活动队列为 134 completed、1 in_progress、352 pending,唯一下一项为 `TSN-PAIR-fuse-pad`。这条独立 Rotate 变异证据不等于全局注册 rotate mutation family 已关闭,`EX-TSN-04` 继续保持 in_progress。