feat: establish reproducible FreeCAD web compatibility baseline

This commit is contained in:
2026-08-10 16:11:38 -04:00
parent e5a5d74dbc
commit b962a5c3b5
733 changed files with 349081 additions and 647 deletions

View File

@@ -0,0 +1,63 @@
# Web FreeCAD CAM exact 闭包实施文档
更新时间2026-08-07
## 1. 验收口径
本轮以 FreeCAD `1.1.1`、提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d` 为 CAM/Path 和 Qt 行为基线。`cnc_wams_gpt6/linuxcnc-master/web` 中已经构建并通过既有回归的 LinuxCNC WebAssembly 是用户指定的实体机床与真实控制器认证权威;它的上游 RS274、canonical command、task/motion、HAL、trajectory planner 和 kinematics 结果决定 G-code 是否被机床接受。
运行介质、源码提交和产物哈希必须保留在报告中以保证复现性。按照项目验收口径LinuxCNC WASM 认证通过后不再要求另一台物理设备作为 CAM-32 的阻塞条件。
## 2. 唯一语义链
1. CAD/FreeCAD Path 生成并保存 `Path::Feature` / `Path::FeaturePython``Path::PropertyPath`Web 端以确定性 Job/Path 表示承接。
2. OpenCAMLib WASM 执行 drop-cutter/waterline 等刀具与曲面算法,产出受版本和哈希约束的刀位结果。
3. CAMotics 官方源码阶段依据 `GCodeMachine.cpp``start/changeTool/setFeed/move/end` 语义生成受控 G-code当前不调用 CAMotics parser避免出现第二套 G-code 解释口径。
4. G-code 生成完成后才允许调用 LinuxCNC WASM。所有语法、模态、子程序/remap、单位、G93/G94、M428/M429、task/motion、轨迹规划和错误诊断只由 LinuxCNC WASM 决定。
5. 连续五轴程序使用目标机 `XYZBC` 配置、`M428` RTCP、逐段 G93 inverse-time feed 和 `M429` identity 恢复,并由 LinuxCNC 上游 task/motion 与 `xyzbcKinematicsInverse` 完成接受测试OCCT 在该链路的仿真侧执行实体材料去除。
强制顺序为:`CAD -> OpenCAMLib WASM -> CAMotics source stage -> G-code -> LinuxCNC WASM`。任何绕过 G-code 生成阶段直接调用控制器、或在 Web/CAMotics 中另行解析最终 G-code 的路径,都不属于本项目 CAM 合同。
## 3. 任务分派
| 任务 | Owner | 交付 | 验收门 | 状态 |
| --- | --- | --- | --- | --- |
| XCAM-01 FreeCAD Path 算法 oracle | ORACLE | 原生 Profile 基准、命令序列、边界、长度、稳定哈希 | FreeCAD GUI/Path 实际运行且固定提交 | completedProfile 基线;其余工序继续) |
| XCAM-02 Qt 动态 oracle | ORACLE+UI | CAM workbench、菜单/工具栏、命令启用、选择状态和 Task 状态 | Xvfb 下真实 Qt action/selection 回放 | completed56 命令Task 生命周期继续) |
| XCAM-03 Path FCStd 双向往返 | IO+ORACLE | `Path::Feature``Path::FeaturePython``Path::PropertyPath` save/open/mutate/save/open | 原生对象、命令与属性不丢失Web 资源级路径编辑默认保护FeaturePython 仅显式 opt-in 且不执行脚本 | native verified / safe resource codec verified / operation semantics in_progress |
| XCAM-04 CAM Job 元数据 | CORE+UI+QUALITY | `CAM_Comment``CAM_PropertyBag``CAM_Compound` 在 Job/JSON/Undo/Redo 中保持一致 | 评论、字符串/数字/布尔属性和复合 Operation 已有边界校验及依赖清理;不代表原生 Path operation-object 或 Python recompute | browser verified / native semantic parity in_progress |
| XCAM-04 OpenCAMLib WASM | KERNEL | 锁定上游提交的 OCL Emscripten 产物和浏览器 Worker | PathDropCutter/Adaptive/Waterline 可执行、可取消、资源有界 | completed |
| XCAM-05 CAMotics 源码阶段 | KERNEL+QUALITY | 锁定官方 CAMotics/C! 源码,按源码运动契约生成 G-code并构建原生 GUI/TPL、headless CLI 与 Python sidecar | 主链不调用 CAMotics G-code parser最终解析只走 LinuxCNC WASM原生 CLI/STL 和 Qt/TPL 冒烟可复跑 | source-stage + native GUI/TPL/CLI completed / browser full-program differential pending |
| XCAM-06 原生实体材料去除 | KERNEL | OCCT cutter sweep/boolean、逐步实体和剩余体积 | BRep 有效、体积单调、资源释放、与 OCL 路径一致 | completed当前平底刀/直线与采样模型) |
| XCAM-07 LinuxCNC RTCP 与机床认证 | CONTROLLER+QUALITY | XYZBC 连续工具轴、G93、M428/M429、限位/奇异/停机报告 | LinuxCNC WASM RS274、task/motion、HAL、kins 全链通过 | completed认证机型泛化安全门继续 |
| XCAM-08 Web Facade/UI 接入 | PLATFORM+UI | CAD→OCL→CAMotics→G-code→LinuxCNC WASM bridge | Chrome 实际 OCL 48 刀位点、65 行 G-code、48 轨迹段并被 LinuxCNC 接受 | completed认证流程完整 Qt 对话框 oracle 继续) |
| XCAM-09 exact 差异闭包 | QUALITY | CAM parity 合同、WBS、证据哈希和零未登记差异 | 所有前置门通过后才能提升声明 | pending |
连续执行顺序为 `XCAM-01/02/03 + XCAM-04/05/06 + XCAM-07 -> XCAM-08 -> XCAM-09`。认证闭环固定使用同一份由 OCL 输出驱动的 G-codeLinuxCNC 接受的是这份最终程序,不是旧的网页路径。
## 4. RTCP G-code 合同
目标控制器为 `cnc_wams_gpt6` 的 LinuxCNC WASM机床配置为 `XYZBC` table-rotary-tilting。程序至少满足
- 入口使用 `G21 G17 G40 G49 G80 G90 G94` 等明确安全模态,并完成 Tool/Spindle/Coolant 状态设置。
- 非 TCP 的安全定位在 identity kinematics 下进行;执行 `M428` 后才允许 XYZBC RTCP 联动。
- 连续切削段使用 `G93`,每个 `G1`/圆弧切削块具有显式正有限 `F` inverse-time 值。
- B 轴必须落在配置的软件限位内C 轴展开必须连续;相邻旋转轴跳变、非有限坐标、零时长段、不可达姿态和奇异邻域必须拒绝或产生明确诊断。
- 退出切削前恢复 `G94`,安全抬刀并执行 `M429`;程序结束时主轴和冷却关闭。
- 认证必须由 LinuxCNC WASM 上游解释器生成 canonical motion并由 task/motion、HAL 和上游 XYZBC kinematics 消费,文本正则检查不能作为接受证据。
## 5. 材料去除合同
主结果由 OCCT 实体布尔生成,输入是 Stock BRep、刀具/刀柄实体和 LinuxCNC canonical motion。每一步记录 operation、motion index、输入/输出 BRep 指纹、去除体积、剩余体积、碰撞和诊断。体积不得增加,空布尔或无效 BRep 必须失败,所有 ShapeHandle/Worker 引用必须归零。
OpenCAMLib 用于 drop-cutter/waterline 等刀具-表面算法,不承担 G-code 解释。CAMotics 固定官方源码提交,源码阶段负责把三轴受控运动写成 G-code工作区的 CAMotics 1.3 Qt/TPL、`camsim``gcodetool``planner` 和 Python sidecar 均已构建并通过对应冒烟,另将上游 sweep C++ 编译为可由浏览器实际加载的 standalone WASM。该 WASM 只覆盖 Conic/Spheroid sweep 与包围盒,不包含完整 `camsim`、TPL、Qt 或 parser它只作为浏览器内核子集证据不进入规范控制链。最终 G-code 不经过 CAMotics parser而是直接交给 LinuxCNC WASMCAMotics 的三轴能力不能代替五轴 LinuxCNC RTCP 运动学认证。
## 6. 证据和声明规则
每个报告必须包含源码提交、构建命令、产物路径、字节数和 SHA-256、运行环境、成功与负例计数、资源释放结果。只有机器可重复执行的报告才能进入 `config/freecad-cam-parity.json`。源码清册、静态字符串或截图不能单独关闭算法、控制器、FCStd 或实体材料去除任务。
## 7. 已通过的主链证据
`config/chrome-cam-linuxcnc-machine-verification.json` 已由 Chrome 150 实际执行OCL 上游 `PathDropCutter` 以 2 个 CAD 操作平面三角面把 5 个候选点解析为 48 个刀位点CAMotics 源码阶段随后生成 2758 字节 G-codeLinuxCNC WASM 接受 65 行、138 个块、48 个轨迹段,解析权威和后端均为 `linuxcnc-wasm`。程序包含 `M428/M429``G93/G94``B5→B15``C359→C361`
这份证据关闭的是选定 `XYZBC table-rotary-tilting` 数字机床案例,不等价于任意机床安全认证、实体执行、完整 FreeCAD Path 算法、浏览器内完整 CAMotics 程序或同输入 simulator differential。

View File

@@ -0,0 +1,77 @@
# CAM 原生内核流水线实施与任务分解
更新日期2026-08-07
## 强制执行顺序
```text
CAD 几何
-> OpenCAMLib WASM 刀位算法
-> CAMotics 源码阶段运动契约
-> 生成规范 G-code
-> LinuxCNC WASM 解析、控制器语义、执行与验收
```
CAMotics 不解析流水线产生的规范 G-code。唯一的 G-code 解析和控制器语义权威是 LinuxCNC WASM。
## 已落地能力
| 任务 | 状态 | 实现与证据 |
| --- | --- | --- |
| CAM-NATIVE-01 OpenCAMLib | 完成 | 上游提交 `95b036fe28ce6d77c97b98e5fbc337904ae49560` 通过 Emscripten 3.1.69 构建;浏览器执行 `PathDropCutter`,不是 TypeScript 重写算法。 |
| CAM-NATIVE-02 OCL 制品门禁 | 完成 | `public/vendor/opencamlib/ocl.js` 为单文件嵌入 WASMSHA-256 为 `0379040910f7af277c6e1f6411efb549292db0b071422a83954d93631253bf89`。 |
| CAM-NATIVE-03 CAMotics 源码阶段 | 完成(源码契约) | 锁定 CAMotics 提交 `e84665f2fa9d1151f03282ac7e01320bc65e015b`,依据 `GCodeMachine.cpp``start``changeTool``setFeed``move``end` 语义生成 G-code适配层不解析输出。 |
| CAM-NATIVE-03B CAMotics 原生构建 | 完成Qt5 GUI + TPL + CLI | CAMotics `e84665f2...` 使用官方 C! `9b6672a0...`、Qt5、V8 ABI `v8_compress_pointers=0` 构建 `CAMotics/camotics``CAMotics/tplang``camsim``gcodetool``planner``build/camotics.so`GUI/TPL 哈希、动态 Qt/V8 依赖、官方 TPL 10/10 测试和 Xvfb 主窗口1200x800、可见均通过 `config/camotics-native-artifact.json`。 |
| CAM-NATIVE-03C CAMotics 独立 WASM 内核 | 完成(扫掠子集) | 直接编译上游 `Sweep.cpp``ConicSweep.cpp``SpheroidSweep.cpp` 为零 imports 的 standalone WASMChrome 150 实际加载并执行 Conic/Spheroid depth、长段包围盒和确定性回放。 |
| CAM-NATIVE-04 OCCT 材料去除 | 完成(当前模型) | 使用 Bitbybit OCCT WASM 创建库存与切削工具并执行 BRep 布尔差;浏览器验证剩余体为结构有效单实体,可导出 BRep。 |
| CAM-NATIVE-05 Chrome 验收 | 完成 | Chrome 150 中 OCL 14 个刀位点、18 行 G-code、库存体积 300、去除体积 12、剩余体积 288、释放后内核引用为 0。 |
| CAM-NATIVE-06 主链 OCL 接管 | 完成(认证机型) | `prepareCamPipeline` 强制调用上游 `PathDropCutter`,以 48 个 OCL 刀位点驱动 CAMotics 源码阶段和 LinuxCNC XYZBC G-code未提供 runner 时不会静默回退。 |
当前材料去除模型是确定性采样的平底刀 BRep 模型。轴向水平直线使用单个连续段包络,任意采样折线使用定向圆柱与端点球的连续段 BRep sweep它是原生 OCCT 实体布尔,但不是 FreeCAD 原生 Path 材料去除的等价实现,能力报告固定为 `freeCadNativeEquivalent: false`
## LinuxCNC WASM 接管
`cnc_wams_gpt6/linuxcnc-master/web/src/app.js` 已提供受控 `postMessage` bridge。父页面只能发送已经生成的 G-codeLinuxCNC 页面等待 machine case ready 后调用原生 `loadProgram`,由 LinuxCNC WASM 上游解释器生成轨迹,再按请求决定是否 `run`;返回结果固定带有 `backend: linuxcnc-wasm``parserAuthority: linuxcnc-wasm`。父页面不接收或替代 RS274 解析,也不把 CAMotics parser 放入执行链。
## 真实边界
- OpenCAMLib上游算法已作为浏览器 WASM 执行。
- CAMotics工作区已具备通过哈希、Qt5/V8 动态链接、官方 TPL 测试和真实 Xvfb 窗口冒烟验证的 1.3 原生 GUI/TPL并保留 `camsim``gcodetool``planner` 和 Python 模块作为宿主 CLI/sidecar同时有直接来源编译的 standalone sweep WASM浏览器可执行该内核子集但不是完整 Qt/TPL/程序运行时。
- CAMotics 解析边界:原生 `camsim` 只在独立冒烟证据中消费仓库示例。规范生产链仍由源码运动契约生成 G-code并直接交 LinuxCNC WASM不得把 CAMotics parser 提升为第二套规范解析器。
- CAMotics 浏览器边界:`public/vendor/camotics/camotics-sweep.wasm` 只包含上游扫掠数学和包围盒,不包含 G-code parser、TPL、Qt、文件系统或完整原生 GUI。能力报告将 `browserWasmKernelExecutable=true``browserExecutable=false` 分开记录Qt5 GUI/TPL 仅在宿主进程中可用。
- LinuxCNC WASM桥接已接入根应用和 LinuxCNC 页面Chrome machine acceptance 已在重建后的 LinuxCNC WASM 产物上通过报告保留解析块、轨迹段、RTCP 模态和限位结果;同一份程序已分别通过 `dry-run``run`
- 连续工具轴:所选 XYZBC table-rotary-tilting 数字机型已完成;其他机型、完整奇异点 oracle 和生产授权仍关闭。LinuxCNC `web/evidence/production-safety-gate-matrix.json` 已覆盖 6 个 5 轴 INI所有 gate fail-closed`productionOpen=false`,没有实体运动或计量认证。
- 曲线扫掠Chrome 已验证 `continuous-segment-sweep-brep` 的结构有效单实体和非零去料;解析 NURBS/圆弧的无弦误差 sweep、刀柄/夹具实体 oracle 仍开放。
## 后续任务安排
| 优先级 | 任务 | 验收条件 | 状态/所有者 |
| --- | --- | --- | --- |
| P0 | CAM-PIPE-01 LinuxCNC WASM 接管 | 将本模块生成的 G-code 送入 LinuxCNC WASM记录解析块、模态状态、刀具/进给、执行轨迹及限位结果;不得调用 CAMotics parser。 | 已完成(认证机型) |
| P0 | CAM-PIPE-02 端到端一致性 | 比较 OCL 刀位、生成 G-code、LinuxCNC WASM 执行轨迹;建立坐标、单位、模态与容差门禁。 | 已完成Chrome 认证链;泛化容差继续) |
| P1 | CAM-SIM-01 CAMotics 原生构建 | 安装并锁定 C!/SCons构建 Qt5 `camotics` GUI、`tplang``camsim``gcodetool``planner` 与 Python 模块提供提交、编译器、Qt/V8 动态依赖、制品哈希、官方 TPL 测试和 Xvfb 窗口冒烟证据。 | 已完成(宿主 Qt5 GUI/TPL/CLI浏览器集成保持边界 |
| P1 | CAM-SIM-02 CAMotics standalone WASM | 从锁定上游 C++ sweep 源码构建零 imports WASM提供 ABI、制品哈希、Node 和 Chrome 实际执行证据;禁止引入第二套规范 G-code parser。 | 已完成sweep 子集;完整程序继续) |
| P1 | CAM-MR-02 任意曲线路径扫掠 | 对 OCL 采样段执行连续段 BRep sweep定向圆柱 + 端点球并集),每个结果通过 OCCT BRep 结构校验;解析任意曲线的无弦误差 sweep 继续保留。 | 已完成continuous-segment 子集;解析任意曲线仍开放) |
| P1 | CAM-5AXIS-01 连续工具轴 | 接入机床运动学、姿态连续性、奇异点和关节限位求解,并由 LinuxCNC WASM 执行轨迹验收。 | 已完成XYZBC 数字机型;泛化姿态/奇异点和其它机型生产门仍开放) |
| P1 | CAM-FCSTD-01 Path 对象往返 | Path Job、ToolBit、ToolController、Operation 和命令列表执行 FCStd 双向 round-trip并与 FreeCAD oracle 比较。 | 待 FCStd 所有者完成 |
## 验证命令
```bash
./npmw run build:camotics-native
./npmw run check:camotics-native
./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
node scripts/check-opencamlib-wasm.mjs
./npmw exec tsx -- --test tests/camNativeSimulation.test.ts
./npmw exec tsc -- --noEmit
node scripts/run-chrome-cam-native-simulation.mjs
node scripts/check-chrome-cam-native-simulation.mjs
npm run test:chrome-cam-linuxcnc-machine
npm run check:chrome-cam-linuxcnc-machine
```
机器可读证据位于 `config/camotics-native-artifact.json``config/camotics-wasm-artifact.json``config/chrome-camotics-wasm-verification.json``config/opencamlib-wasm-artifact.json``config/chrome-cam-native-simulation-verification.json``config/chrome-cam-linuxcnc-machine-verification.json` 与 LinuxCNC `web/evidence/digital-machine-five-axis-certification.json`

File diff suppressed because it is too large Load Diff

View File

@@ -12,7 +12,7 @@
源码、构建和安装目录均在 `.cache/` 下,不进入 Git。仓库保存精确提交、构建参数、工具版本、产物哈希和回放契约当前产物是用于几何对照的无界面 Part oracle不是完整 FreeCAD 桌面发行版。
本机 oracle 可作为锁定版本的行为参考。`./npmw run probe:freecad-reference` 会通过 `FreeCADCmd` 采集版本、Git 提交、GUI 能力、可导入 Python 模块和核心 TypeId/Property 元数据,输出机器可读报告;当前无界面构建只启用 `Part``Material``Measure`,未加载的 Sketcher、PartDesign、TechDraw 等模块会明确标记为 unavailable。完整桌面/工作台对照仍需单独构建 GUI oracle不能从该报告推断已支持。
本机 oracle 可作为锁定版本的行为参考。`./npmw run probe:freecad-reference` 会通过 `FreeCADCmd` 采集版本、Git 提交、GUI 能力、可导入 Python 模块和核心 TypeId/Property 元数据,输出机器可读报告。模块状态明确区分 `not-built``compiled-importable``compiled-import-failure``gui-only-unprobeable`,并分别记录 `compiled``importable``guiRequired``guiAvailable`;当前无界面构建报告 3 个 `compiled-importable`、9 个 `not-built`。完整桌面/工作台对照仍需单独构建 GUI oracle不能从该报告推断已支持。
## 2. Debian trixie 依赖

View File

@@ -0,0 +1,49 @@
# FreeCAD CAM Path 原生 Oracle 实施说明
更新时间2026-08-07
这份说明覆盖浏览器 CAM 对标所需的三类原生证据FreeCAD Path 算法回放、Qt CAM 工作台动态状态、以及 `Path::Feature` / `Path::FeaturePython` 的 FCStd 保存与恢复。当前 Web 编辑边界是经 FreeCAD 重开验证的原生 `Path::Feature` 命令资源子集Python-backed 对象仍只读且不执行代码。
## 参考环境
- FreeCAD1.1.1,源码提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`
- 构建:`.cache/freecad/install-desktop/bin/FreeCAD`
- GUI通过 `xvfb-run` 启动,`GuiUp=true`
- Qt运行时采集为 6.8.2
- CAM 模块:`PathApp.so``PathGui.so``PathSimulator.so` 均来自桌面构建
## 已完成的原生证据
| 能力 | 证据 | 状态 |
| --- | --- | --- |
| 原生 Profile 算法 | `Mod/CAM/CAMTests/test_profile.fcstd`,真实 `Path.Op.Profile` 覆盖工具补偿和无补偿两种场景;每种生成 32 条命令,其中 20 条切削命令;命令按 0.01 mm 数值容差规范化并锁定 SHA-256 | verified-2-scenarios |
| 原生 Helix 算法 | `Mod/CAM/CAMTests/test_holes00.fcstd`0.9 mm 刀具、9 个 base 子元素,覆盖 Inside/Outside 与 Climb/Conventional 四种组合;每种包含 1260 条原生 G2 或 G3 弧命令并验证 CW/CCW 方向 | verified-4-scenarios |
| Qt 动态 oracle | 激活 `CAMWorkbench`,读取 56 个实时 `CAM_*` 命令、QAction 文本/图标/快捷键/注册状态、菜单和工具栏;并通过真实 `setEdit()`、QDialogButtonBox OK/Cancel、14 个 Task 字段和关闭回放验证 Job/Profile Task 生命周期 | verified |
| 原生 Path FCStd | 创建 `Path::Feature``Path::FeaturePython`,保存、重开、修改路径和属性、再次保存并重开;`Path::PropertyPath`、5/6 条命令和标签均被 FreeCAD 恢复 | verified |
| Web Path 编辑与透明往返 | Facade 对 `Path::Feature` 解码/重写 `.nc` 资源;显式 `allowFeaturePython` 时也可对 `Path::FeaturePython` 只改 `.nc` 资源,追加命令后由 FreeCAD 重开验证 5→6 条;脚本和 XML 仍保持不执行/不改写 | verified-safe-resource-only-opt-in |
结构化结果在 [`config/freecad-cam-path-oracle.json`](../config/freecad-cam-path-oracle.json)。生成和校验脚本分别是 [`scripts/run-freecad-cam-path-oracle.ts`](../scripts/run-freecad-cam-path-oracle.ts)、[`scripts/freecad-cam-path-oracle.py`](../scripts/freecad-cam-path-oracle.py) 和 [`scripts/check-freecad-cam-path-oracle.mjs`](../scripts/check-freecad-cam-path-oracle.mjs)。
## 复跑和门禁
```bash
./npmw run probe:freecad-cam-path
./npmw run check:freecad-cam-path
./npmw run test:freecad-cam-path-report
```
`probe` 会在 `.cache/freecad/cam-path-oracle/` 生成源档案、变更档案和 Web 透明副本。报告中的 FCStd 完整性哈希是重开后 Path 对象语义哈希运行时仍比较透明副本和源档案的完整字节。Profile 命令使用 0.01 mm 规范化,避免 OCCT 在 1e-6 mm 级别的浮点抖动造成假差异。连续两次完整 probe 的报告语义结果稳定。
## 任务安排
| 任务 | 交付物 | 当前状态 | 后续验收 |
| --- | --- | --- | --- |
| ORA-CAM-PATH-01 | Profile/Helix 等 Path 算法原生 fixture 与规范化黄金 | in_progressProfile 2 场景 + Helix 4 场景) | 继续扩展 Drilling、Pocket、Surface 等工序的输入、失败和版本黄金 |
| ORA-CAM-PATH-02 | Qt 工作台命令、QAction、菜单、工具栏、选择上下文和 TaskPanel 生命周期采集器 | completed56 命令 + Job/Profile 生命周期) | 扩展更多工序的字段/校验/焦点黄金 |
| ORA-CAM-PATH-03 | 原生 `Path::Feature` / `Path::FeaturePython` FCStd 双向保存恢复 | completednative-native | 增加 Job、ToolController、SetupSheet 和 Dress-up 对象 |
| ORA-CAM-PATH-04 | Web Facade `Path::PropertyPath` 结构化解码/编码与可编辑事务 | completedPath::Feature + FeaturePython 安全资源 opt-in | 扩展 Job/Operation 对象、属性/重算语义和 Undo/Redo不宣称完整 operation-object 语义 |
| ORA-CAM-PATH-05 | FreeCAD Path 与 OpenCamLib/CAMotics 的连续差分 | pending | 版本锁定、同一 stock/tool/path 输入、体积/碰撞/时间差分 |
## 明确边界
当前 Web Facade 对 `Path::Feature` 提供结构化 `Path::PropertyPath` 解码/编码;对 `Path::FeaturePython` 只有显式 `allowFeaturePython: true` 才开放同样的资源级编辑。两者都只允许修改已有 native `.nc` 资源的命令列表,资源路径、版本和 Center 元数据保持不变XML、脚本和 Python 代码从不执行或改写,编辑后由 FreeCAD 重开验证。算法 oracle 当前只覆盖 2 个 Profile 场景和 4 个 Helix 场景;完整 Path 操作对象、FeaturePython 属性/重算语义、其余工序算法、Undo/Redo 和全量 Qt Task 行为仍未达到 exact parity整体报告的 `exactParityClaim=false`

View File

@@ -212,7 +212,7 @@ Bitbybit npm 快照仍锁定为 `.cache/bitbybit/bitbybit` 提交 `d3f52bd1fcf78
|---|---|---|
| QA-01 | 单元、属性、parser、图算法与领域状态覆盖 | 核心错误分支和不变量有自动测试 |
| QA-02 | FreeCAD CLI/GUI 对照器 | 每个兼容命令至少一个成功和一个失败 fixture |
| QA-03 | Chrome/Firefox/Safari E2E 与视觉基线 | 目标版本矩阵可审计,无 P0/P1 回归 |
| QA-03 | Chrome E2E 与视觉基线 | 目标版本矩阵可审计,无 P0/P1 回归 |
| QA-04 | 几何/求解确定性与 fuzzing | 公差内稳定,随机输入不崩溃/错绑 |
| QA-05 | 性能和内存 | 1000 对象、百万三角形、大装配、大表、长会话 P95/峰值达预算 |
| QA-06 | Worker/WASM/OPFS 故障注入 | 取消、崩溃、配额、断电点、过期结果和恢复行为通过 |
@@ -236,6 +236,8 @@ Bitbybit npm 快照仍锁定为 `.cache/bitbybit/bitbybit` 提交 `d3f52bd1fcf78
本机参考环境、R0-R9 执行批次、立即队列和单项完成定义见 [FreeCAD 1.1.1 全功能对标执行路线图](freecad-reference-execution-roadmap.zh-CN.md)。当前缓存 oracle 是 headless `Part/Material/Measure` 子集;完整桌面工作台行为必须由 O2 oracle 单独采集。
详细执行分配见 [FreeCAD 1.1.1 全功能对标执行 WBS](freecad-full-parity-execution-wbs.zh-CN.md)。`config/freecad-execution-plan.json` 当前登记 10 个 owner lane、10 个 program/gate 和 83 个带依赖、交付物及验收条件的任务,并由 `./npmw run check:execution-plan` 校验;`config/freecad-source-inventory.json` 记录锁定源码的 34 个模块、CMake 开关、App/Gui 目录、Python 文件和命令入口,由 `./npmw run check:freecad-inventory` 校验;`config/freecad-type-property-inventory.json` 记录源码可追溯的 TypeId/Property 候选,由 `./npmw run check:freecad-type-properties` 校验。
最近执行队列不得跳过依赖:
1. 完成 `BASE-01..04``INV-01..06``BYB-01..03`,生成全命令/对象/属性清册、完整 oracle 和可复现 Bitbybit/OCCT 源码构建。

View File

@@ -0,0 +1,122 @@
# FreeCAD Web Exact Promotion Runbook
本手册描述如何从当前兼容子集推进到系统级 FreeCAD exact。基线固定为 FreeCAD 1.1.1,提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`,浏览器基准为 Chrome 150。手册不允许通过改写能力矩阵、截图或最终几何猜测来缩短证据链。
## 当前状态
- exact claim`false`
- exact 任务:`1/52 completed``37 in_progress``14 pending``0 blocked`
- exact 模块:`0/34`
- promotion task`EX-REL-01=pending`
- 三项硬边界:无原生 MappedNameRef/StringHasher、无逐阶段 builder、无唯一同构来源时 fail-closed
## 实施顺序
### 1. 冻结基线与证据环境
任务:`EX-ORA-01/02/03`
1. 锁定 FreeCAD 源码、FreeCADCmd、GUI 构建、OCCT/Bitbybit/WASM、浏览器版本和许可证清单。
2. 生成 TypeId、Property、GUI command、format、entrypoint inventory每个候选必须有源码位置和 runtime 状态。
3. 建立成功、失败、禁用、取消、重算、保存重开六类 oracle fixture。
4. 运行 `npm run check:freecad-inventory``check:freecad-type-properties``check:freecad-gui-commands``check:freecad-entrypoints`
5. 运行 `npm run check:freecad-oracle-coverage`,核对 34 个模块和 1113 个 GUI 命令是否与真实桌面报告逐项一致;该 gate 同时报告未构建模块和仍待逐对象 probe 的静态候选。
6. 运行 `npm run check:freecad-golden-coverage`,按 feature family 核对成功、失败、history、复合阶段、ElementMap2、FCStd 往返和浏览器回放七个维度;用 `-- --details` 输出逐 family 缺口。新增原生 feature-family fixture 时必须同时通过 `test:golden:freecad:families``test:golden:freecad:family-failures`,任何 missing 项继续保留为 EX-ORA-02 blocker。
7. 运行 `npm run check:freecad-partdesign-failures``npm run check:freecad-partdesign-revolution-groove``npm run check:freecad-partdesign-transform``npm run check:freecad-part-builders`。原生缺输入后仍为 `Up-to-date + Valid + null Shape` 的 feature 必须分类为 `accepted-empty`,不能计入失败覆盖;只有真实 rejected 诊断才能关闭 `failure-fixture` 维度。局部重算失败保留旧 Shape 时,必须同时保存 `Invalid` 状态、原生诊断和 stale Shape不得把旧 Shape 当作成功结果。
退出条件:没有未分类模块、命令、属性、格式或入口;所有后续任务均可引用固定 oracle。
### 2. 闭合内核、逐阶段历史与命名
任务:`EX-KER-01``EX-TSN-01/02/03/04`
1. 为每个 Part/PartDesign/Boolean/Pattern/Dress-up builder 采集输入、每个中间 Shape、结果 Shape 和原生 history。
2.`Generated/Modified/Deleted` 按生产 stage 和 result index 写入 Facade禁止把最终 Shape 的索引套到中间阶段。
3. 让 native provider 输出 MappedNameRef、StringHasher、ElementMap2 token 的实际证据;没有证据时写 `final-shape-only`
4. 以对称 Boolean、拆分/合并、重复面/边/点和跨对象竞争模型验证唯一来源与 ambiguous 候选持久化。
5. 运行 30-case ElementMap2/StringHasher gate、native history Chrome gate 和 topology replay。
退出条件:错误绑定、未解释关系、名称漂移、命名证据缺失及边界违规均为零;否则保持 compatible/fallback。
### 3. 完成 App 文档和特征内核
任务:`EX-DOC-01..05``EX-SK-01/02``EX-PART-01``EX-PD-01/02`
1. 按 Property 类型、状态标志、表达式、LinkSub、Extension、Group、Body/Tip、Attachment、Datum、Binder 建立逐字段 oracle。
2. 完成事务、observer 顺序、DAG 重算、局部失败、抑制、Undo/Redo、多文档和恢复语义。
3. 按 Sketcher、Part、PartDesign 的特征族逐项推进;每个特征必须同时有成功、非法输入、取消、编辑、保存重开和 native history 证据。
4. 每提升一个 feature level更新 `compatibility-matrix.json`,不得批量提升整个 workbench。
退出条件对象图、参数、Shape、history、拓扑引用和诊断在 FreeCAD↔Web↔FreeCAD 中稳定。
### 4. 完成 FCStd 与格式入口
任务:`EX-FC-01``EX-FMT-01..04`
1. FCStd 按 Document.xml、GuiDocument、BRep、ElementMap2、StringHasher、脚本、未知资源逐项闭合。
2. BREP/STEP/IGES 完成单位、颜色、名称、装配层级、容差和失败诊断。
3. STL/OBJ/PLY/DXF/SVG/PDF/IFC/CSV/GCODE 按对象和元数据建立双向或显式只读契约。
4. JT/IDF/OpenSCAD/Cloud/Help 逐项决定浏览器实现、受控 sidecar 或正式排除;不得保留 scope-only。
退出条件:支持格式无未知差异;不能实现的格式有明确排除报告,不计入 exact claim。
### 5. 完成 GUI 和工作台流程
任务:`EX-UI-01..05``EX-DRAFT-01``EX-TD-01``EX-SS-01``EX-PLOT-01``EX-DOCWB-01``EX-ASM-01``EX-BIM-01``EX-SURF-01``EX-MESH-01``EX-MAT-01`
1. 建立 FreeCAD GUI oracle菜单、工具栏、工作台、Combo/Task、属性、对话框、快捷键、上下文、焦点和状态栏。
2. 每个工作台回放新建、选择、Task、属性修改、错误、取消、Undo/Redo、保存重开和导出。
3. 对桌面、390px、键盘、读屏树、locale、长文本和 GPU fallback 做同一流程对照。
4. 只有动态 enable/visible/focus/validation 与原生 oracle 对齐后UI 任务才能完成。
退出条件:零未登记 UI 差异、零遮挡、零无名控件、零核心流程阻断。
### 6. 完成 FEM/CAM/Robot/数据/脚本/插件
任务:`EX-FEM-01``EX-CAM-01``EX-ROBOT-01``EX-DATA-01``EX-INSPECT-01``EX-SCRIPT-01``EX-ADDON-01``EX-PROXY-01``EX-PLATFORM-01`
1. FEM对象、网格、材料、求解器、结果场和后处理与原生 benchmark 对照。
2. CAM全部 Path operation/dress-up、原生 operation-object、Task、后处理、仿真、刀具/夹具和机床配置对照;生产授权继续 fail-closed。
3. Robot、Points、ReverseEngineering、Inspection 完成算法、数据和报告闭环。
4. Python/macro 只允许 capability-secure、可审计、可复现的受限 APIAddon 必须签名、隔离、可回滚。
5. 五个 proxy 模块要么获得原生差分证据,要么出具正式排除边界。
退出条件:所有模块达到 exact或被明确记录为不属于最终 exact scope不能留 unexplained。
### 7. QA、报告和 promotion
任务:`EX-QA-01/02/03``EX-REL-01`
1. 运行 Chrome/Firefox/Safari、GPU fallback、桌面/平板/移动矩阵。
2. 完成无障碍、locale、性能、安全、fuzz、压力、迁移、崩溃恢复和资源释放。
3. 汇总八项指标:`wrongBindings``unexplainedRelations``roundtripNameDrift``unknownSemanticDifferences``namingEvidenceMissing``namingEvidenceBoundaryViolations``unexplainedModules``releaseBlockers`
4. 仅由 EX-REL-01 生成 `config/freecad-web-exact-promotion-report.json`,其结构必须符合 [report schema](../config/freecad-web-exact-promotion-report.schema.json)。
5. 运行 `npm run check:freecad-web-exact-promotion`;通过后才可同步 claim、模块等级和签名发布物。
## Promotion 报告最低结构
```json
{
"schemaVersion": 1,
"taskId": "EX-REL-01",
"completedTasks": 52,
"exactModules": 34,
"metrics": {
"wrongBindings": 0,
"unexplainedRelations": 0,
"roundtripNameDrift": 0,
"unknownSemanticDifferences": 0,
"namingEvidenceMissing": 0,
"namingEvidenceBoundaryViolations": 0,
"unexplainedModules": 0,
"releaseBlockers": 0
},
"evidenceClasses": [
"native-oracle", "browser-runtime", "save-reopen-roundtrip",
"failure-cancel-recovery", "resource-release", "security",
"accessibility", "signed-release"
]
}
```
当前不应创建该报告;在 EX-REL-01 完成前缺少报告是预期状态promotion gate 必须保持 `freecad-web-exact-promotion-fail-closed`

View File

@@ -0,0 +1,480 @@
# FreeCAD 1.1.1 全功能对标执行 WBS
## 1. 文档职责
本文负责执行组织和任务分配;[全功能主任务账本](freecad-complete-parity-backlog.zh-CN.md)负责范围,[执行路线图](freecad-reference-execution-roadmap.zh-CN.md)负责阶段顺序,`config/freecad-execution-plan.json` 是任务、依赖、状态、交付物和验收条件的机器可读真值,`config/compatibility-matrix.json` 是能力等级真值。
基线固定为 FreeCAD `1.1.1`、提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`。所有项目 Node/npm 命令使用 `./npmw`
## 2. 责任分配
这里的 owner 是责任域,不绑定具体人员。给团队分配人员时,每个 lane 必须有一个最终负责人;跨 lane 评审不能替代 owner 的交付责任。
| Lane | Owner 职责 | 主 program | 必需评审方 |
|---|---|---|---|
| ORACLE | FreeCAD 构建、运行时探针、命令/对象/格式清册、黄金 fixture | P01 | QUALITY、相关工作台 owner |
| KERNEL | Bitbybit/OCCT 源码构建、WASM、Worker、Shape 生命周期、三方几何差分 | P02 | TOPO、QUALITY |
| TOPO | TopoRef、原生历史、签名、迁移、3D 选择和变异回放 | P03 | KERNEL、CORE、QUALITY |
| SKETCH | planegcs、草图模型、约束、诊断、编辑器和压力套件 | P04 | TOPO、CORE、QUALITY |
| CORE | App/Document/DAG、Part、PartDesign、Body/Tip、Support/Attachment | P05 | TOPO、SKETCH、IO |
| IO | SQLite/OPFS、FCStd、BRep/Shape、格式和双向 round-trip | P06 | CORE、QUALITY |
| DOC | TechDraw、Spreadsheet、Draft、Plot | P07 | CORE、IO、QUALITY |
| ENGINEERING | Assembly、BIM、Mesh/MeshPart、Surface | P08 | CORE、IO、PLATFORM |
| PLATFORM | FEM、CAM、Robot、Inspection、数据模块、Addon、脚本 | P09 | ENGINEERING、QUALITY |
| QUALITY | 自动化、浏览器、性能、安全、迁移、SBOM 和发布 | P10且持续横切 P01-P09 | 所有 lane |
## 3. 依赖与并行安排
关键路径为:`P01 → P02 → P03 → P04 → P05 → P06 → P07/P08 → P09 → P10`。P10 的日常 QA 任务从 P01 开始横切执行,但发布门 G9 仍等待全部上游产物。
允许的并行工作:
1. P01 建立完整 oracle 时P02 可继续已有原生 Worker 加固,但 G1 必须等待 G0 的比较器和 fixture。
2. P03 的 schema/迁移基础与 P02 的浏览器实例化可并行;原生历史覆盖和三方黄金必须等待 P02。
3. P04 的 planegcs 构建可在 P03 前启动外部几何、Support 和完整压力回放必须等待稳定 TopoRef。
4. P06 的 ZIP 安全、Document/GuiDocument 映射和未知字段保留可与 P05 并行;可编辑 Shape 和完整 round-trip 必须等待 P05。
5. P07 与 P08 在 G4/G5 后并行BIM 依赖 Draft/Spreadsheet 的共享对象和表达式合同。
6. P10 的单测、安全预检和基线持续执行;最终发布任务必须等待 P01-P09 全部阶段门。
禁止的并行捷径:用 UI prototype 替代领域实现、用 Node smoke 替代浏览器证据、用网格索引替代 TopoRef、在 FCStd 未保留未知字段时写回用户文件、在 solver/post/addon 未隔离时启用执行入口。
## 3.1 连续执行编排与任务交接
以下编排是 P01-P10 的连续执行顺序;任务 ID 与状态仍以 `config/freecad-execution-plan.json` 为唯一真值。每个切片完成后立即领取同一关键路径上的下一个未完成切片,不等待人工确认。
1. `TSN-03` 先扩展 native OCCT `Generated/Modified/Deleted` 合同:从 `fuse/cut/common` 扩展到已实现的 Pad、Pocket、Loft、Pipe、Revolution、Groove、Fillet、Chamfer、Draft、Thickness、Pattern、Hole每个操作必须有 STEP/Worker 请求、源子形状关系、Chrome 回放和释放证据。随后把关系交给稳定 TopoRef 迁移和 Body/Tip 生命周期。
2. P04 按 `SK-06 → SK-07 → SK-11 → SK-09 → SK-10 → SK-12` 执行:先补 planegcs 几何约束图,再补尺寸/参考诊断和 profile fixture之后完成交互编辑、B-spline 编辑、500 模型黄金与压力回放。
3. P05 按 `PART-ALL → PD-BASE → PD-LOFT → PD-DRESSUP → PD-TRANSFORM → PD-CLOSURE` 执行;每个特征都必须同时覆盖参数编辑、失败保留上一 Shape、TopoRef/Support/Tip、撤销、保存/加载和 Chrome Worker 证据。
4. P06 与 P05 可交错推进:`FC-04 → FC-05 → FC-06 → FC-08 → FC-09 → FC-10 → FC-11`。STEP/IGES/BREP 的已实现子集不得替代完整 100 模型格式黄金;未知 XML、BRep、Expression、Link、TopoRef 和 GuiDocument 都必须分类记录。
5. P07 按 `TD-ALL``SS-ALL``DRAFT-BASE → DRAFT-OPS``PLOT-ALL``DOC-CLOSURE` 执行P08 可在 P07 共享对象合同完成后并行,顺序为 `ASM-CORE → ASM-TOOLS``BIM-CORE → BIM-IFC``MESH-CORE``SURF-CORE``ENG-CLOSURE`
6. P09 在 P08 收口后按 `FEM-ALL``CAM-ALL``ROBOT-ALL``INSP-ALL``DATA-ALL``ADDON-ALL``SCRIPT-ALL``PLATFORM-CLOSURE` 执行;插件和脚本默认隔离,不能绕过 Facade、OPFS 权限或安全策略。
7. P10 横切持续执行:`QA-01..QA-08` 按依赖逐项收口,之后 `REL-01 → REL-02 → REL-03 → REL-04`。发布前必须重新生成 Chrome 证据、FreeCAD oracle、round-trip、fuzz、性能、故障注入、SBOM 和差异矩阵。
所有任务的完成条件统一为实现已落地FreeCAD 1.1.1 oracle 或明确 proxy/unsupported 证据存在Chrome 真实 Worker/OPFS 证据存在Shape/Worker/资源释放回到零Facade、构建和 `./npmw run verify` 通过;文档、兼容矩阵和计划状态同步。未满足任一条件只能保持 `in_progress`,不得提前标记 `completed`
## 4. Program 任务包
### P01 完整桌面 oracle 与 34 模块清册
OwnerORACLE。GateG0。当前 headless oracle 只覆盖 `Part/Material/Measure`
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| ORA-01 | ORACLE完整 GUI/工作台 CMake profile、构建清单、依赖和 hash | 锁定提交可干净重建GUI/工作台可探针 |
| ORA-02 | ORACLEGUI-aware 探针和 compiled/import/gui-only 状态模型 | 输出确定性 JSON失败类型不可混淆 |
| INV-01 | ORACLE34 模块、工作台、命令及源码位置清册 | 无未登记目录或命令 |
| INV-02 | ORACLETypeId、Property、默认值、状态和最小对象 fixture先由 `generate:freecad-type-properties` 生成源码候选,再由 O1/O2 探针确认 | 只读/隐藏/输出/表达式能力可追溯;静态候选不能替代运行时证据 |
| INV-03 | ORACLE菜单、工具栏、上下文、快捷键、选择和 Task 前置 | 每个 GUI 命令有启用和禁用 oracle |
| INV-04 | ORACLE+IO+PLATFORM格式、偏好、Python、宏、Addon 和可选库 | 每个入口有 Web 策略和能力等级 |
| BASE-03 | ORACLE+QUALITY100 成功、50 失败 fixture | 覆盖单位、拓扑变化、核心对象和错误 |
| BASE-04 | ORACLE+QUALITY树/属性/Shape/拓扑/诊断比较器 | 未登记差异直接失败 |
### P02 原生 OCCT Worker、三方 Boolean 黄金与内存门禁
OwnerKERNEL。GateG1。现有原生历史 provider 为可配置、非默认状态。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| BYB-03 | KERNELBitbybit/OCCT 可复现源码构建、补丁、ABI、hash、许可证 | 干净构建导出一致 |
| BYB-05 | KERNEL能力握手、取消、超时、崩溃、stale-result 协议 | 错误消息安全失败;重启不接受旧结果 |
| BYB-06 | KERNELShape 所有权、引用计数、释放账本和指标 | 无 use-after-release保留内存受控 |
| BROWSER-OCCT-01 | KERNEL+QUALITYChrome 真实 Worker/WASM harness | COOP/COEP、OPFS、加载、取消、崩溃恢复通过 |
| BYB-07 | KERNEL+ORACLE+TOPOFuse/Cut/Common 三方报告 | 几何、历史、公差和错误差异均可解释 |
| MEM-OCCT-01 | KERNEL+QUALITY1000 次 Boolean 压力和堆/WASM/GPU 报告 | 临时 Shape 全部对账;峰值/保留量达预算 |
| BYB-08 | KERNEL+QUALITY依赖升级 API/ABI/黄金漂移门禁 | 上游变化不能静默进入主线 |
### P03 稳定 TopoRef、邻接/曲率签名和变异回放
OwnerTOPO。GateG2。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| TSN-03 | TOPO+KERNELBoolean/PartDesign Generated/Modified/Deleted | 每个源子形状关系可解释 |
| TSN-04 | TOPO解析曲线/曲面参数、方向、容差和曲率签名 | 不依赖三角网格精度和瞬时索引 |
| TSN-05 | TOPO邻接图、一对一/一对多评分和置信度 | 刚体变换和参数修改保持安全引用 |
| TSN-06 | TOPO对称、重复、分裂、合并歧义策略 | 低置信度不强绑 |
| TSN-07 | TOPO+CORE多输入 Boolean、Pattern、跨 Body lineage | 结果可追溯到源对象和实例 |
| TSN-08 | TOPO+IOLinkSub、外部几何、数据库、FCStd 迁移 | stable/ambiguous/deleted 可跨版本往返 |
| TSN-09 | TOPO+CORE3D pick/preselect/highlight/candidate repair Facade | UI 不保存网格索引 |
| TSN-10 | TOPO+QUALITY100 模型、1000 参数变异和随机回放 | 无静默错绑;歧义全部可诊断 |
### P04 planegcs WASM 与完整 Sketcher
OwnerSKETCH。GateG3。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| SK-03 | SKETCH+KERNEL最小 planegcs 源图、Emscripten 构建和 hash | 独立 Worker 确定性求解 |
| SK-04 | SKETCHprovider 能力、诊断、取消、stale、崩溃恢复 | 替换 solver 不改变 Facade 合同 |
| SK-05 | SKETCH椭圆、B-spline、周期和构造几何模型 | 稳定 ID 完整往返 |
| SK-06 | SKETCH完整几何约束 | 每种约束有成功/失败 FreeCAD fixture |
| SK-07 | SKETCH尺寸/参考约束、DOF、冗余、冲突分类 | 分类与 FreeCAD oracle 一致 |
| SK-08 | SKETCH+TOPO平面/面 Support、投影、CarbonCopy | 上游拓扑变化安全迁移 |
| SK-09 | SKETCHtrim/extend/split/drag/autoconstraint 和回放 | Task、键鼠和编辑行为与 oracle 对齐 |
| SK-10 | SKETCHB-spline poles/knots/weights/degree/periodic | 编辑和约束 round-trip 通过 |
| SK-11 | SKETCH+CORE开放/闭合/多环/自交 profile 分类 | PartDesign 获得兼容错误 |
| SK-12 | SKETCH+QUALITY500 模型确定性与性能套件 | 成功、冲突、冗余、拖拽均达预算 |
SK-10 收口证据:`public/chrome-sketcher-bspline-harness.html` 在 Chrome 150 中回放 poles/knots/weights/degree/periodic 编辑和非法输入,并将带两个 Weight、一个 control-point InternalAlignment 的三次有理 B-spline 经 FCStd 导出/导入后逐字段比较。`./npmw run test:chrome-sketcher-bspline``./npmw run check:chrome-sketcher-bspline` 还会交叉检查 planegcs Worker/Provider 和 FreeCAD 1.1.1 Weight oracle几何、约束、残差、DOF 与归档往返均通过。
SK-12 收口证据:固定种子 500 模型/1000 次求解覆盖 constraints、conflict、redundant、reference、drag 各 100 项Node 与 Chrome 150 摘要均为 `edac8aed`,确定性差异和意外结果为 `0`,最大迭代 `64`、最大残差约 `4.58e-16`Chrome 耗时低于 `2000 ms` 预算。`./npmw run test:chrome-sketcher-stress``./npmw run check:chrome-sketcher-stress` 记录 OPFS 生命周期FreeCAD 约束分类和 editor oracle 单独锁定分类与拖拽语义。
SK-06/SK-07 增量证据:`public/chrome-sketcher-diagnostics-harness.html` 在 Chrome 150 + OPFS 中回放 Coincident指定端点零残差与 Block`0` DOF、坐标保持并同时验证参考尺寸、冗余和冲突诊断`./npmw run test:chrome-sketcher-diagnostics``./npmw run check:chrome-sketcher-diagnostics` 通过OPFS marker 创建/读取/删除完成。该证据仍不代表 planegcs 原生已覆盖完整 FreeCAD 约束集。
SK-06 原生子集增量:锁定 FreeCAD `GCS::System::addConstraintP2PCoincident``solveCoincidentLines` Embind/WASM 函数Facade 仅接受 `first.end -> second.start` 的两线 driving Coincident。`./npmw run test:chrome-planegcs``./npmw run check:chrome-planegcs` 在 Chrome 150 Dedicated Worker 中验证状态 `0`、零残差、Provider 生命周期和 `coincident` capability完整约束图仍待继续扩展。
SK-07 原生尺寸增量:锁定 FreeCAD `ConstraintDifference``solveDistanceX` Embind/WASM 函数Facade 仅接受单线正值 `DistanceX` 与 Horizontal 组合。Chrome 150 Dedicated Worker 验证 X 差值、零残差和 capability完整 DistanceY/角度/半径/参考尺寸图仍待继续扩展。
SK-07 原生尺寸增量:`solveDistanceY` 将相同的 FreeCAD `ConstraintDifference` 合同扩展到单线 Vertical 投影距离。Chrome 150 Dedicated Worker 验证 Y 差值、零残差和 `distanceY` capability任意端点、角度、半径和参考尺寸图仍待继续扩展。
SK-07 原生角度增量:`solveAngle` 锁定 FreeCAD `GCS::System::addConstraintP2PAngle`,以固定首点、正值端点 Distance 和弧度 Angle 求解单线。Chrome 150 Dedicated Worker 验证 45 度、长度 5、零量级残差、`angle` capability 与 Provider 生命周期;任意端点、两线夹角、半径/直径和完整尺寸图仍待继续扩展。
SK-07 原生圆半径增量:`solveCircleRadius` 锁定 FreeCAD `GCS::System::addConstraintCircleRadius`,固定圆心并接受一个正值 Radius。Chrome 150 Dedicated Worker 验证圆心 `(2,3)`、半径 `4`、零残差、`radius` capability 与 Provider 生命周期Arc、Diameter、圆与其他几何的关系及完整尺寸图仍待继续扩展。
SK-07 原生圆直径增量:`solveCircleDiameter` 锁定 FreeCAD `GCS::System::addConstraintCircleDiameter`,固定圆心并接受一个正值 Diameter。Chrome 150 Dedicated Worker 验证圆心 `(2,3)`、直径 `8``diameter` capability 与 Provider 生命周期Arc、圆与其他几何的关系及完整尺寸图仍待继续扩展。
SK-06/SK-07 原生 Equal 增量:`solveEqualLines` 使用 FreeCAD `GCS::System::addConstraintEqualLength`,固定第一条线和第二条线起点,求解两线等长;`solveEqualCircles` 使用 `addConstraintEqualRadius`固定两个圆心和第一圆半径求解第二圆半径。Facade 仅接受两线或两圆的单个 driving Equal混合几何、圆弧、椭圆和完整约束图继续显式拒绝。Chrome 150 Dedicated Worker 验证两类零残差、能力声明、资源释放及取消/恢复/过期生命周期;计划计数仍为 30 completed、21 in_progress、32 pending、0 blocked。
SK-06 原生 Tangent 增量:`solveTangentCircles` 锁定 FreeCAD `GCS::System::addConstraintTangent(Circle, Circle)`固定两个圆心和第一半径求解外切第二半径。Facade 仅接受两个 Circle 的单个 driving Tangent线-圆、圆弧、内切模式和多约束图显式拒绝。Chrome 150 Dedicated Worker 验证圆心 `(2,3)`/`(10,3)`、两半径 `4`、切线残差约 `8.9e-16``tangent` capability 与生命周期;计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。
SK-11 收口证据:锁定 FreeCAD 1.1.1 的真实 Body/Sketch/Pad oracle。闭合、带孔、自交 bow-tie、分离双环分别得到体积 `360/320/80/370` 和实体数 `1/1/2/2`,开放线框返回 `Wire is not closed.` 且 Shape 为空。Web `sketchProfile` 在交点处分割线段并提取有界面,以 `additionalRegions` 表达 FreeCAD 多实体结果Chrome 150 的生产 parser 与 Bitbybit OCCT Pad 得到相同体积和实体数,开放线框在调用运行时前返回 `PROFILE_OPEN`。FreeCAD/Chrome 检查器、Facade `166/166` 与 TypeScript 通过SK-11 完成。
SK-09 收口证据:真实 FreeCAD 1.1.1 editor oracle 覆盖 drag、split、extend、trim、construction、事务 Undo/Redo 和 Coincident+Horizontal 自动约束。Web 对齐拖动优先点、Split Coincident 与 Trim PointOnObject并以 `SketchEditorInteractionSession` 提供工具、指针、选择、历史、取消和删除事务。Chrome 150 真实 `PointerEvent`/`KeyboardEvent` 回放与七项 FreeCAD 几何/约束结果一致SK-09 完成。
FC-06 Chrome 增量:`src/chromeFcstdSemanticHarness.ts` 增加两项稳定 TopoRef 的 `App::PropertyLinkSubList`Chrome 150 + OPFS 验证 `topo-ref-list` 依赖、归档往返、GuiDocument 和 BRep/ElementMap 保持不丢失;完整 FCStd 全类型双向 round-trip 仍未闭环。
### P05 Part/PartDesign 参数化闭环
OwnerCORE。GateG4。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| CORE-09 | COREBody、Origin、Feature 顺序、Tip 重定向和单实体 | 抑制/删除/重排与 FreeCAD 一致 |
| CORE-10 | CORE+TOPOSupport、MapMode 和 Attachment engine | 面/平面支撑可跨拓扑变化 |
| CORE-11 | COREAttachmentOffset、Placement 组合和局部坐标链 | 结果位置在声明公差内一致 |
| PART-ALL | CORE+KERNELPart 基本体、Boolean、Builder、修改、检查和格式 | 全 Part 命令及交换格式黄金通过 |
| PD-BASE | CORE+SKETCHPad/Pocket/Revolution/Groove 全模式 | 参数编辑使用原生历史重算 |
| PD-LOFT | COREAdditive/Subtractive Loft/Pipe | 失败保留最近有效 Shape |
| PD-DRESSUP | CORE+TOPOFillet/Chamfer/Draft/Thickness 稳定选择 | 边面变化迁移或报告歧义 |
| PD-TRANSFORM | CORE特征列表变换、完整 Hole 和标准 | 单实体、轴面、螺纹语义有证据 |
| PD-CLOSURE | CORE+QUALITY创建→编辑→重算→Undo→保存→加载 | 无 stale Shape、断 Tip 或 Support |
PART-ALL 收口证据Chrome 150 锁定 100 个 Part 场景,对 STEP、IGES、BREP 各执行 100 次导出/导入和结构、质量属性、容差比较,未知差异为 `0` 且释放后 ShapeHandle/kernel reference 为 `0/0``./npmw run test:chrome-fcstd-golden``./npmw run check:chrome-fcstd-golden`、Part primitive/geometry feature 门禁与 FreeCAD 100 成功/50 失败 fixtures 共同覆盖原语、Boolean、Builder、Modification、检查和三格式验收。
PD-BASE 收口证据FreeCAD 1.1.1 实际 PartDesign 对照锁定锥度 Pad、锥度 Pocket、Through all Pocket、Up to face Pocket 和 Midplane Pad 5/5Chrome 150/WASM 得到相同体积(误差不超过 `1e-7`)并释放到 `0/0`。Facade 覆盖 To-face 稳定 TopoRef、双向与两角度模式、失败保留上一 ShapeChrome 参数编辑 `42→31`、重算、Undo `31→42`、保存/加载通过Pad/Pocket/Revolution/Groove 原生 OCCT history 分别记录 `25/42/23/2` 条关系。
PD-LOFT 收口证据Chrome 150 通过 Facade 顺序创建 AdditiveLoft、AdditivePipe、SubtractiveLoft、SubtractivePipe四个结果均为正体积有效 ShapeTransformed transition、section/path 链、Body.Tip、OPFS 保存/加载和 `0/0` 释放通过。重复 section 与分叉 path 分别返回稳定诊断Loft/Pipe 失败期间 Shape ID 不变且修复后恢复FreeCAD 1.1.1 原生四对象 oracle 4/4Loft/Pipe 原生 OCCT history 为 `24/28` 条。
PD-DRESSUP 收口证据Chrome 150 Facade 生命周期在 Hole 基体上顺序创建 Fillet、Chamfer、Draft、Thickness随后继续 Mirrored、LinearPattern、PolarPattern、MultiTransform 与 Hole10 个结果均为正体积Body.Tip、sqlite-opfs 保存/加载和 `0/0` 释放通过。Pad 参数编辑后一个面引用稳定迁移,三个边/面引用保守报告歧义且没有错误绑定;歧义 Fillet 保留上一有效 Shape并可修复恢复。FreeCAD 1.1.1 原生 Fillet/Chamfer/Draft/Thickness oracle 4/4通过真实选边/选面、Reversed Thickness 和质量/拓扑断言;四类原生 OCCT history 分别记录 `150/150/5/38` 条。
### P06 FCStd 双向 round-trip
OwnerIO。GateG5。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| FC-04 | IODocument/GuiDocument 对象、Property、Extension、视图映射 | 已知元数据双向无语义丢失 |
| FC-05 | IO+KERNELBRep/Shape/缩略图资源解析和写出 | 拓扑、质量属性、颜色、精度对齐 |
| FC-06 | IO+TOPO+SKETCHExpression/Unit/Link/TopoRef/Sketch codec | FreeCAD 可重算支持对象 |
| FC-07 | IO+QUALITY未知 XML/对象/资源透明保留和脚本隔离 | proxy 字节在读写后不变 |
| FC-08 | IO+KERNELSTEP/IGES/BREP 完整适配 | 100 模型单位/颜色/公差黄金通过 |
| FC-09 | IO+相关 workbenchMesh/2D/BIM/数据格式 | 每格式有成功、失败和 round-trip |
| FC-10 | IO+ORACLEFreeCAD→Web→FreeCAD 核心/代理报告 | 无静默丢失;差异全部分类 |
| FC-11 | IO+QUALITY大文件、损坏、取消、中断和恢复 | 能力内不崩溃;超限明确拒绝 |
P06 已由 `check:fcstd-closure` 聚合关闭FreeCAD 1.1.1 原生双向 22 场景没有未知差异,未知 proxy 归档逐字节保持Chrome 锁定 Expression/Link/LinkSubList/TopoRef/Sketcher/GuiDocument/BRep/ElementMap 语义。100 模型 FCStd+BRep 以及 STEP/IGES/BREP 三格式质量、毫米单位和容差矩阵全部通过DXF/SVG/PDF、OBJ/PLY/STL、IFC、CSV 八种次级格式分别具有成功、错误签名拒绝和字节精确回环。FCStd ZIP/XML/stream 限额、损坏、取消与 checkpoint 恢复由 `check:fcstd-hardening` 锁定。
### P07 TechDraw、Spreadsheet、Draft、Plot
OwnerDOC。GateG6。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| TD-ALL | DOC+TOPOPage/View/Section/Dimension/GD&T/Annotation、SVG/PDF | 投影、比例、TopoRef 更新通过 |
| SS-ALL | DOC+CORECell/Formula/Alias/Style/Merge/Binding/CSV | DAG 循环和对象绑定与 FreeCAD 一致 |
| DRAFT-BASE | DOC+SKETCHWorking Plane/Snap/Grid 和参数化二维对象 | 创建编辑 fixture 通过 |
| DRAFT-OPS | DOC+CORE变换、Offset、Trim、Array、Clone、Layer | 保存后仍参数化 |
| PLOT-ALL | DOCSeries/Axis/Legend/Style/Binding、图片/SVG/CSV | 绑定数据确定性更新 |
| DOC-CLOSURE | DOC+IO+QUALITY四工作台混合文档 | 创建、编辑、保存、加载、导出全通过 |
### P08 Assembly、BIM、Mesh、Surface
OwnerENGINEERING。GateG7。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| ASM-CORE | ENGINEERINGComponent/Link/LCS/Joint、solver Worker | 固定/距离/角度/运动 fixture 通过 |
| ASM-TOOLS | ENGINEERING碰撞、爆炸、BOM、变体 | 大装配和 FCStd 门禁通过 |
| BIM-CORE | ENGINEERING+DOC空间层级、建筑元素、材料、属性集、清单 | 参数编辑和数量表通过 |
| BIM-IFC | ENGINEERING+IOIFC2x3/IFC4、分类和 proxy | 几何、层级、Property 往返 |
| MESH-CORE | ENGINEERING+KERNEL导入、转换、分析、修复、Worker/LOD | 非流形、自交、孔和大网格通过 |
| SURF-CORE | ENGINEERING+TOPOBSpline/Bezier/Fill/Offset/Trim/Join | 连续性、容差和 TopoRef 通过 |
| ENG-CLOSURE | ENGINEERING+QUALITY大型混合工程项目 | 跨工作台保存加载和性能达预算 |
### P09 分析、制造、数据、插件和脚本
OwnerPLATFORM。GateG8。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| FEM-ALL | PLATFORMAnalysis/Material/Sets/Loads/Mesh/Solver/Results | 本地或远端策略明确;参考求解通过 |
| CAM-ALL | PLATFORMJob/Stock/Tools/Operations/Simulation/Post | 碰撞、仿真和 G-code 黄金通过 |
| ROBOT-ALL | PLATFORMRobot/Axes/Pose/Trajectory/Kinematics/Collision | 运动和工作空间 fixture 通过 |
| INSP-ALL | PLATFORM+TOPO测量、剖切、偏差、检查和报告 | 单位、精度、TopoRef 和导出通过 |
| DATA-ALL | PLATFORM+IOPoints/RE/OpenSCAD/IDF/JT/Material/Import | 每模块有适配器或显式 proxy |
| ADDON-ALL | PLATFORM+QUALITY签名目录、安装/更新/删除、权限、隔离、回滚 | 不可信插件不能越过 Facade/权限 |
| SCRIPT-ALL | PLATFORM+QUALITYAPI 映射、受限解释器、宏回放 | 文件/网络/时间/资源权限强制执行 |
| PLATFORM-CLOSURE | PLATFORM+ORACLE34 模块最终覆盖报告 | 无 scope-only 或未解释 unsupported |
### P10 QA、浏览器、性能、安全、迁移与发布
OwnerQUALITY。GateG9。P10 从第一天持续执行,最终关闭依赖 P01-P09。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| QA-01/02 | QUALITY+ORACLE单元/属性覆盖、CLI/GUI 每命令成功失败 fixture | 核心不变量和兼容声明有证据 |
| QA-03 | QUALITYChrome E2E 与视觉矩阵 | 核心桌面/移动工作流无阻断差异 |
| QA-04 | QUALITY+TOPO+SKETCH几何/solver/parser seeded fuzz | 无崩溃、静默损坏和错绑 |
| QA-05 | QUALITY1000 对象、百万三角形、大装配、大表和长会话 | P95、峰值和保留内存达预算 |
| QA-06 | QUALITY+IO+KERNELWorker/WASM/OPFS 崩溃、配额、断电、stale | 恢复确定,数据损失明确报告 |
| QA-07 | QUALITY+PLATFORM文件、消息、脚本、Addon、CSP 和权限安全 | 无未处置 critical |
| QA-08 | QUALITY+DOC键盘、读屏、locale、长文本和移动 | 核心流程达到目标 a11y 标准 |
| REL-01 | QUALITYPWA、离线、cache、COOP/COEP、CSP runbook | 首装、升级、离线、缓存恢复通过 |
| REL-02 | QUALITY+IO版本迁移、回滚或无损导出演练 | 每个支持版本有恢复路径 |
| REL-03 | QUALITYSBOM、许可证、漏洞和签名产物 | 无未知二进制或未处置 critical |
| REL-04 | QUALITY+全体 owner最终能力/差异矩阵和发布 runbook | G0-G9 通过,无未解释 unsupported |
## 5. 任务状态与交接合同
状态只允许 `pending``in_progress``completed``blocked``completed` 必须同时满足:代码/文档已落地、配置中的 deliverables 全存在、acceptance 全有自动证据、兼容矩阵已更新、下游 owner 已完成接口验收。
每次跨 lane 交接必须包含:
1. 版本化 Facade/Worker/schema 合同。
2. 能力探测和 unsupported 原因。
3. 成功、失败、取消、超时、stale 和资源释放测试。
4. FreeCAD oracle fixture 与差异报告。
5. 持久化/迁移影响和安全说明。
6. 下游不得依赖的内部句柄、瞬时索引或实现细节。
阻塞条件必须记录具体缺失依赖、复现命令和解除条件;“任务很大”或“以后支持”不是有效阻塞原因。
## 6. 统一门禁
日常增量:
```bash
./npmw run check:execution-plan
./npmw run verify
git diff --check
jq empty config/freecad-execution-plan.json
jq empty config/compatibility-matrix.json
```
## 14. ADDON-ALL 与 SCRIPT-ALL 增量证据
`src/facade/addonGovernance.ts` 已落地插件目录治理合同:包内容摘要、可信签名者、权限白名单、依赖检查、安装/更新/回滚/删除和清单导出。插件包只登记 Facade 命令入口,不执行桌面 Python、网络或任意文件系统代码默认仅允许 `geometry.read``project.read`。篡改摘要、未知签名者、越权权限和未满足依赖都会在进入目录前拒绝。
`src/facade/scriptSandbox.ts` 已落地脚本宏合同:仅允许登记的 Facade 命令 ID限制命令数和参数字节数支持确定性录制、JSON 导入和回放诊断,不调用 `eval`、网络、文件系统或桌面 Python 解释器。
`./npmw run test:addon``./npmw run test:chrome-addon``./npmw run test:script``./npmw run test:chrome-script` 使用 Chrome 150、隔离上下文和 OPFS 资源 round-trip 证明两个合同及资源释放;对应 `check:chrome-*` 是机器门禁。此增量仍不是完整 FreeCAD AddonManager/Python API没有在线仓库协议、桌面 Python 执行或第三方插件运行时,兼容等级保持 `experimental`
SURF-CORE 已完成受控曲面合同Bezier/BSpline/Loft/Fill/Offset、参数域 Trim、C0 连续性、Sew 容差、稳定边界 TopoRef、质量分析和确定性 OBJ。Chrome 150 验证 5 个 patch、20 个 poles、1 个 trim、1 个 sew、`1.5` offset 和 4 个稳定 TopoRef并完成 sqlite-opfs 往返及资源归零。
QA-08 增量由 `src/facade/locale.ts` 提供:`en-US``zh-CN``de-DE` 消息和单位格式化、长文本样例,以及可访问名称/重复 ID/可聚焦控件语义检查。`./npmw run test:locale``./npmw run test:chrome-qa08` 在 Chrome 150 + OPFS 下通过,`./npmw run check:chrome-qa08` 记录 4 个控件、0 个缺名/重复/未命名焦点控件。该证据不等于完整 WCAG/读屏认证,仍需最终 QA-08 人工与自动矩阵。
FC-09 增量由 `src/facade/secondaryFormats.ts` 提供DXF、SVG、OBJ、PLY、STL、PDF 的签名探测、大小限制、确定性导出和显式 proxy/native 能力矩阵。`./npmw run test:secondary-formats``./npmw run test:chrome-secondary-formats``./npmw run check:chrome-secondary-formats` 使用 Chrome 150 + OPFS 验证 6 个格式记录及资源释放;这不是完整 FreeCAD 原生格式解析,二级格式仍按 proxy 边界管理。
QA-05 的通用基准保持 1000 个文档对象、1,000,000 个三角形索引计算和 100,000 个表格单元ENG-CLOSURE 另增加真实 1000 组件 Assembly/BOM 构建预算Chrome 150 实测约 `5.04 ms`,低于 `1000 ms` 门槛。百万三角形索引基准与工程工作台真实对象预算分别记录,不混写为同一种模型。
PLOT-ALL 已完成:`src/facade/plot.ts` 支持线性/对数轴、Series/Legend/Style/Spreadsheet Binding 和确定性 SVG/CSVChrome 150 使用真实 SVG 解码与 Canvas PNG 编码生成 `640x360``19408` byte 的 PNG两次导出 SHA-256 一致且签名、OPFS round-trip/release 均通过。聚合门禁同时验证绑定值由 Spreadsheet 确定性更新到 `16`
DOC-CLOSURE 已完成Chrome 150 内真实创建 Spreadsheet、Draft、TechDraw、Plot 实例并分别编辑一次,公式值为 `6`、Draft 起点 X 为 `1`、TechDraw 尺寸为 `5`、Plot 末值为 `6`;实际导出 Spreadsheet CSV、Draft JSON、TechDraw SVG/PDF、Plot SVG/CSV。四个 artifact 均从版本 `1` 更新到 `2`,文档版本 `8`,保存到 sqlite-opfs 后字节精确读取、释放并重开,依赖闭包无缺失或环。`check:document-closure` 已纳入 `verify`,统一要求 TD-ALL、SS-ALL、DRAFT-BASE、DRAFT-OPS、PLOT-ALL、DOC-CLOSURE 的浏览器报告和资源归零。
ENG-CLOSURE 已完成真实混合工程闭包Assembly、BIM、Mesh、Surface 实例各创建并编辑一次JSON/IFC/OBJ 导出均为非空;四个 artifact 版本为 `2`、工程版本为 `8`sourceRef 完整sqlite-opfs 保存、字节读取、释放和重开通过。`check:engineering-closure` 聚合 Assembly Worker/FCStd、BIM IFC2X3/IFC4、Mesh Worker LOD/修复、Surface TopoRef 和混合工程预算,并通过 `check:chrome-engineering` 纳入 `verify`
REL-03 增量增加 `scripts/release-signature.mjs` 及受控入口:本地使用权限为 `600``.secrets/release-signing-private.pem`CI/发布机使用 `RELEASE_SIGNING_PRIVATE_KEY``RELEASE_SIGNING_KEY_ID`;两条路径都强制 Ed25519、公钥匹配和 payload SHA-256缺少密钥时 fail-closed不会生成 `unsigned-development` 发布清单。`./npmw run check:release-signing-key``./npmw run test:release-signature``check:release-artifacts``check:release-closure` 共同验证签名、验签、篡改拒绝与清单闭包。
QA-07 增量由 `src/facade/securityPreflight.ts` 统一执行资源路径、归档条目/压缩比、XML 禁止声明和插件权限白名单预检。`./npmw run test:security-preflight``./npmw run test:chrome-security``./npmw run check:chrome-security` 在 Chrome 150 + OPFS 下验证 4 类恶意输入拒绝、资源 round-trip 和释放;这不是完整安全审计,仍需持续 fuzz 与发布环境扫描。
## 14. ADDON-ALL 增量证据
`src/facade/addonGovernance.ts` 已落地插件目录治理合同:包内容摘要、可信签名者、权限白名单、依赖检查、安装/更新/回滚/删除和清单导出。插件包只登记 Facade 命令入口,不执行桌面 Python、网络或任意文件系统代码默认仅允许 `geometry.read``project.read`。篡改摘要、未知签名者、越权权限和未满足依赖都会在进入目录前拒绝。
`./npmw run test:addon``./npmw run test:chrome-addon` 使用 Chrome 150、隔离上下文和 OPFS 资源 round-trip 证明该合同及资源释放;`./npmw run check:chrome-addon` 是 ADDON-ALL 的机器门禁。此增量仍不是完整 FreeCAD AddonManager没有执行桌面 Python、在线仓库协议或第三方插件运行时兼容等级保持 `experimental`
ASM-CORE/ASM-TOOLS 已完成受控装配合同:固定/重合、距离、角度和运动帧均有 fixture浏览器通过独立 module Worker 求解碰撞、爆炸、BOM、变体、1000 组件预算和真实 FCStd `App::Link` 归档/重开通过。BIM-CORE/BIM-IFC 同时覆盖 Site/Building/Level/Space、材料、属性、分类、数量表及 IFC2X3/IFC4 双 schema 摘要往返。MESH-CORE 覆盖焊接、退化移除、OBJ/PLY/STL、Worker LOD以及自交、非流形和孔 fixture。
REL-01 增量增加 `public/sw.js` 的真实 Chrome 生命周期门禁:`src/chromeOfflineHarness.ts` 注册并取得 Service Worker 控制权,验证 shell 预缓存、旧 cache 版本清理和断连后的缓存回退;`vite.config.ts` 在生产构建后注入 `dist/assets/*`(含 WASMprecache`scripts/check-built-pwa-assets.mjs` 防止哈希资源遗漏。同一回放通过 OPFS marker、SQLite-OPFS 资源 round-trip 与 Shape 释放检查。`./npmw run test:chrome-offline``./npmw run check:chrome-offline``./npmw run check:built-pwa` 只使用 Chrome 150证明 PWA 首装/升级/离线恢复的可执行子集;完整发布仍需部署环境的 CSP、缓存 CDN 和断电矩阵。
QA-06/REL-02 专项回放复核:`./npmw run test:chrome-fault-injection` 验证 planegcs Worker 的完成、取消、注入崩溃、不可用态、重建恢复和 stale 结果,且 OPFS marker 删除;`./npmw run test:chrome-opfs-migration` 验证 schema 1→6 迁移、重开、checkpoint、资源 round-trip、注入失败回滚和 SQLite 文件清理。两个 `check:chrome-*` 均只接受 Chrome 150 + crossOriginIsolated + OPFS 证据;它们不替代真实配额耗尽和操作系统断电演练。
FC-10 增量增加 `src/facade/fcstdRoundTrip.ts` 的稳定指纹和未知差异分类合同;`src/chromeFcstdRoundTripHarness.ts` 在 Chrome 150 + OPFS 回放 `freecad-web-freecad``web-freecad-web` 两个方向,验证对象/属性/GUI/Shape 语义、SQLite-OPFS 资源释放和 `FC-10` marker。`./npmw run test:fcstd-roundtrip``./npmw run test:chrome-fcstd-roundtrip``./npmw run check:chrome-fcstd-roundtrip` 已纳入机器门禁;它覆盖当前可编辑/proxy 子集,不宣称完整 FreeCAD 全模块 round-trip。
PD-CLOSURE 增量扩展 `BitBybitWebCadFacade.app.document``reorderBodyFeature` 保持依赖拓扑顺序,非法重排原子拒绝;`removeObject` 默认拒绝有依赖对象,显式 `cascade` 才删除依赖闭包,并自动重定向 Body.Tip。Chrome PartDesign lifecycle 现验证结构删除、Undo/Redo、Tip 回退/恢复、参数编辑、抑制、保存加载和 Shape 释放;报告写入 `config/chrome-partdesign-lifecycle-verification.json`,完整多 Body/跨文档重排仍未宣称完成。
PD-TRANSFORM 已完成 Feature-list 与 Whole shape 两类变换LinearPattern、PolarPattern、Mirrored 和有序 MultiTransform 支持显式方向/轴/平面,局部模式按 additive/subtractive 原始特征工具应用并强制 PartDesign 单实体。Hole 已覆盖标准/规格、左右旋、线程深度和实际螺旋模型线程Chrome 150 的 14 步链、FreeCAD 1.1.1 的 Feature-list/ISO M6 oracle、四类原生 OCCT history、OPFS 重开与 Shape 释放均由 `check:chrome-partdesign-transform``check:freecad-partdesign-transform` 锁定。
PD-CLOSURE 已由 `check:partdesign-closure` 聚合关闭。Chrome lifecycle 在初始、参数编辑、Undo 和 OPFS 重开后分别生成不同 ShapeHandlePad 体积为 `504→372→504→504`,各阶段 Body.Tip=`pad`、Sketch.Support=`XY_Plane`、solid=1Loft/Pipe 与 dress-up 的三类失败均保留上一有效 Shape 并在修复后生成新 Shape。基础模式、四类 Loft/Pipe、14 步 dress-up/transform/Hole 创建链、三套保存加载、15 类原生历史及全部资源归零同时通过。
## 15. P09 平台工作台闭包证据
FEM 以本地轴向参考求解策略覆盖材料、节点集、约束、载荷、位移/应力结果场CAM 覆盖 Job/Stock/Tool/Operation、碰撞负例、仿真、GRBL/LinuxCNC 白名单后处理和确定性 G-codeRobot 覆盖三轴正运动学、工作空间、轨迹、碰撞及控制器导出Inspection 覆盖距离、角度、面积、体积、偏差、截面和稳定/歧义 TopoRef 报告。四套 Chrome 150 报告均通过隔离、sqlite-opfs 往返和 Shape 资源归零。
Points、ReverseEngineering、OpenSCAD、IDF、JT、Material、Import 七个专业模块逐项登记为受支持适配器或显式 proxy。AddonManager 通过摘要/签名者/权限/依赖、安装、更新、回滚和删除门禁Script 仅回放白名单 Facade 命令,并显式拒绝 file/network/time/resource 四类环境能力。
`config/platform-module-coverage.json` 与锁定 FreeCAD 1.1.1 源清单逐项对齐 34 个模块,结果为 24 compatible、7 proxy、3 development、0 unexplained。`check:platform-closure` 聚合七份浏览器实跑报告、模块边界和 16 个可执行证据脚本FEM-ALL、CAM-ALL、ROBOT-ALL、INSP-ALL、DATA-ALL、ADDON-ALL、SCRIPT-ALL、PLATFORM-CLOSURE 已关闭。
## 16. P10 QA 与发布闭包证据
QA-01/02 由 24 个测试套件、217 个 Node 用例、100 个成功/50 个失败 FreeCAD golden、19 类 Sketcher 成功/失败 oracle、17 个 PartDesign oracle 和 22 个 FCStd 双向 round-trip 场景关闭。QA-03 的 Chrome 150 生产构建回放 8 个核心流程,桌面/移动截图均为有效 PNG初始几何预览来自 Bitbybit OCCT任务态 canvas 仍通过像素和 WebGL 检查。
QA-04 三套固定种子 fuzz 覆盖 1000 个 FCStd parser、2000 个 geometry input、2000 个 Sketch solver 模型,均有正/负分类、输入不变性、确定性和 P95。QA-05 覆盖 1000 对象、1000000 三角形、100000 表格单元Chrome 堆约 35 MBQA-06 覆盖 Worker/WASM 取消、崩溃、恢复、stale、OPFS 迁移和事务回滚QA-07 覆盖路径/归档/XML/权限、Addon 和 Script、CSP/依赖审计。
QA-08 同时检查 en-US/zh-CN/de-DE、单位与长文本、4 个 Facade 语义控件、真实应用 8 步键盘焦点、165 个 Accessibility Tree 节点、390px 移动布局和两张截图。REL-01 验证 PWA 安装、cache 升级清理、离线回退和 WASM precacheREL-02 验证 schema `1→6`、6 个正向迁移、6 个回滚和 OPFS 清理REL-03 生成 172 组件 CycloneDX SBOM、无 critical audit并用 Ed25519 签名 74 个 dist 文件清单。
REL-04 的 `release-capability-matrix.json` 引用 34 模块覆盖G0-G9 全部 pass`exact=0/compatible=24/proxy=7/development=3/unsupported=0`,无 scope-only 或 unexplained 条目;`docs/release-runbook.zh-CN.md` 定义签名、部署、缓存、迁移、回滚和诊断步骤。QA-01..QA-08、REL-01..REL-04 全部完成。
涉及 FreeCAD、OCCT 或浏览器时追加:
```bash
./npmw run probe:freecad-reference
./npmw run test:golden:freecad
./npmw run test:occt-history
```
浏览器 E2E、内存、FCStd round-trip、solver、FEM/CAM 或安全任务必须执行各自配置中声明的专项证据,不能只用 `./npmw run verify` 关闭任务。
## 17. 后续对标波次DATA-PTS/RE-FIT2026-08-07
P01-P10 收口后,按 FreeCAD 1.1.1 的 `Points` 命令表Import、Export、Convert、Merge、PolyCut、Structure`ReverseEngineering` 命令表Plane、Sphere、Cylinder直接领取下一批可移植功能。网页 Facade 现在提供:
- ASCII `ASC/PTS/XYZ/CSV/PCD/PLY` 点云解析和确定性导出UTF-8、点数、字节、PTS 计数、ASCII-only PCD/PLY 和非有限数值均有拒绝诊断。
- 点云平移、合并、AABB/XY 多边形裁剪、体素降采样、XY 结构化网格和统计边界/质心;派生云不修改源云。
- 基于协方差特征分解和最小二乘的平面、球体、圆柱、二次多项式曲面拟合以及半径邻域区域分割返回稳定方向、尺寸、系数、RMS、簇标签和源 ID共线/退化点集拒绝。
- Chrome 150 + crossOriginIsolated + sqlite-OPFS 实跑CSV 主点云 6 点、PTS/PCD/PLY 解析、合并 12、AABB/多边形裁剪各 4、降采样 1、结构网格 `3×2`、六种格式导出和 `0/0` 资源释放;拟合结果为平面 RMS `1.73e-16`、球半径 `2`、圆柱半径 `3`/高度 `8`、多项式 RMS `0`,区域分割为两个各 2 点的簇。
因此 `Points``ReverseEngineering``proxy` 提升为 `compatible` 子集E57/二进制点云、Poisson 重建、法向驱动区域生长、完整 B-spline 曲面拟合和桌面 Python/Qt 交互仍明确保留为差异。平台矩阵现为 `exact=0/compatible=26/proxy=5/development=3`,无 unexplained 项;`check:chrome-data``check:platform-closure` 和完整 `verify` 均必须继续通过。
## 18. FreeCAD UI/交互对标执行波次UI-19..UI-30
P01-P10 的 `83/83` 完成只表示既定功能和发布门已收口,不表示网页界面已经与 FreeCAD 桌面端完全一致。已有 Chrome E2E、键盘、移动布局和截图证据只能作为本波次的输入不能直接关闭 UI 任务。UI 对标基线固定为 FreeCAD `1.1.1`、提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d``UI-01..UI-18` 的现有应用壳和组件合同继续有效,`UI-19..UI-30` 负责逐界面、逐状态和逐流程完成桌面行为对照。
### 18.1 对标合同
对标不以“看起来类似”为验收。每个界面必须同时记录 FreeCAD 来源、默认布局、尺寸/停靠关系、菜单和控件顺序、可见/启用条件、焦点与键盘行为、命令调用、事务边界、成功/失败/取消结果和浏览器差异。语义顺序、命令状态和使用流程按 `exact` 验收;字体栅格化、操作系统窗口装饰和浏览器原生文件选择器按 `compatible` 验收,并在差异清单中逐项说明。
| 界面范围 | FreeCAD 对标要求 | Web 验收要求 |
|---|---|---|
| 菜单 | 保持 File/Edit/View/Tools/Macro/Windows/Help 和工作台菜单的顺序、分组、分隔符、图标、助记键、快捷键提示及动态启用条件 | 同一文档、工作台和选择状态下,命令可见性、顺序、启用/禁用及原因与 oracle 一致;未实现命令显式禁用,不得静默成功 |
| 工具栏 | 保持标准、视图、工作台及领域工具栏的分组、图标、tooltip、切换态和工作台切换后的显隐 | 桌面宽度优先复现 FreeCAD 工具栏行;窄屏只允许确定性 overflow不得改变命令语义或遮挡视口 |
| 工作台 | 工作台选择器位置、名称、切换后的菜单/工具栏/任务状态和活动文档关系一致 | 切换必须通过命令注册表原子更新;进行中的 Task 按 FreeCAD 规则阻止、确认或结束,不能留下旧工作台命令 |
| Combo View | 左侧停靠区、Model/Tasks 标签、模型树、选择同步、展开状态、搜索/过滤和可调整分隔条一致 | 树与 3D 选择双向同步对象状态、Body/Tip、可见性和活动对象可辨识布局保存/恢复确定 |
| Task panel | 任务标题、参数分组、选择提示、预览、错误、Apply/OK/Cancel 和任务锁定顺序一致 | 打开命令自动进入 Tasks预览不提交文档Apply/OK 建立正确事务Cancel/Esc 回滚草稿并恢复 Model/选择/焦点 |
| Data/View 属性 | Data/View 标签、分组、名称、只读/隐藏/输出状态、单位、枚举、Placement、Link/LinkSub、表达式和 mixed 值一致 | Enter/失焦/Cancel 提交语义明确;编辑走 Facade/Command Bus非法值保持原值并定位错误多选不覆盖 mixed 值 |
| 对话框 | 标题、字段、标签页、按钮顺序、默认按钮、校验、焦点、Enter/Esc、尺寸和打开位置与对应 FreeCAD 对话框一致 | 偏好、导入/导出、保存/关闭、颜色/线型、表达式、单位及命令参数逐类回放;浏览器文件选择器差异单独登记 |
| 快捷键 | FreeCAD 默认快捷键、菜单 accelerator、命令序列和作用域一致 | 命令搜索与 tooltip 展示同一绑定;输入框/视口/Task 作用域无冲突;浏览器保留键必须提供等价入口和明确差异 |
| 上下文菜单 | 根据树、视口、对象类型、子元素、多选、空白区和工作台生成相同的命令组与状态 | 右键前选择规则、菜单位置、分隔组、启用谓词和执行后的选择/焦点均有 oracle不得以通用菜单替代领域菜单 |
| 状态栏 | 显示当前命令提示、预选对象/子元素、坐标/单位、进度、取消和错误入口 | 鼠标移动、预选、长任务、保存和失败状态实时更新;完成/取消后清理,不覆盖持久错误和未保存状态 |
| 使用流程 | 保持“新建/打开文档 -> 选择工作台 -> 创建或选择对象 -> Task 参数/预览 -> Apply/OK/Cancel -> Data/View 编辑 -> 重算 -> 保存/导出”的动作、选择和事务语义 | Part、PartDesign、Sketcher、Draft、TechDraw、Spreadsheet、Assembly、BIM、Mesh、FEM/CAM 各有成功、失败、取消、Undo/Redo、保存重开回放 |
### 18.2 任务分配
本波次沿用第 2 节责任 lane共享 React Presentation 壳由 `CORE` 主责,领域工作台 owner 负责本工作台菜单、Task 和上下文贡献,`ORACLE` 提供 FreeCAD 证据,`QUALITY` 拥有最终门禁。状态仅允许 `pending/in_progress/completed/blocked`。任务建立后已立即领取 UI-19..UI-28已有 Web 实现和 Chrome 证据只能使任务进入 `in_progress`,完整 FreeCAD GUI oracle 缺失时不得标记 `completed`
| 任务 | Owner | 依赖 | 交付与验收 | 状态 |
|---|---|---|---|---|
| UI-19 FreeCAD GUI oracle 与 UI manifest | ORACLE+QUALITY | INV-03、ORA-02 | 采集锁定版本的菜单、工具栏、工作台、Combo/Task、属性、对话框、快捷键、上下文和状态栏至少覆盖空文档、活动文档、单选、多选、Task、错误六类状态产出可追溯 manifest、截图和焦点/命令回放 | in_progress |
| UI-20 应用壳、菜单和文档区 | CORE | UI-19、UI-01 | 顶部菜单、菜单分组/状态、MDI 文档标签、活动文档、关闭确认和中心视口布局与 oracle 对齐;桌面基准下关键边界在声明的像素容差内,命令状态无未知差异 | in_progress |
| UI-21 工具栏与工作台切换器 | CORE+各工作台 owner | UI-19、UI-20、UI-09 | 标准/视图/领域工具栏、图标/tooltip/切换态、工作台选择及动态贡献对齐;切换后旧命令清理,窄屏 overflow 可键盘访问且不改变命令顺序 | in_progress |
| UI-22 Combo View 与模型树 | CORE+TOPO | UI-20、UI-03、UI-04、TSN-09 | Model/Tasks、分隔条、树层级、展开/选择/可见性/活动 Body/Tip、拖放和上下文前置对齐树/3D 双向选择、保存恢复、万级节点回放通过 | in_progress |
| UI-23 Task panel 与命令生命周期 | CORE+SKETCH+各工作台 owner | UI-21、UI-22、UI-08 | 通用 Task 容器和 Sketcher/PartDesign/领域 Task 模板对齐标题、参数组、选择提示、预览、Apply/OK/Cancel成功、校验失败、Esc、命令切换、Undo/Redo 的事务和焦点回放一致 | in_progress |
| UI-24 Data/View 属性编辑器 | CORE+DOC+TOPO | UI-22、UI-05..UI-07、INV-02 | Data/View 分类、属性顺序、编辑器、单位、表达式、LinkSub、只读状态和 mixed 值与对象元数据一致;单选/多选、非法输入、提交/取消、重算和 FCStd 重开通过 | in_progress |
| UI-25 对话框系统与浏览器替代策略 | CORE+IO+PLATFORM | UI-19、UI-20、FC-04 | 对偏好、导入/导出、保存/关闭、颜色/线型、表达式、单位和领域参数建立逐对话框合同按钮顺序、默认动作、Tab 顺序、Enter/Esc、校验和恢复一致文件/权限差异可追溯 | in_progress |
| UI-26 快捷键、accelerator 与命令路由 | CORE+QUALITY | UI-20、UI-21、UI-14 | FreeCAD 默认绑定、菜单提示、命令搜索、chord/作用域和输入焦点冲突矩阵完成;同一命令只走一个注册表,浏览器保留键有等价路径,真实键盘回放无误触 | in_progress |
| UI-27 上下文菜单与选择语义 | TOPO+CORE+各工作台 owner | UI-22、UI-24、TSN-09 | 树/视口/空白、对象/子元素、单选/多选上下文命令、分组和状态与 oracle 一致;右键选择、预选、执行后选择及歧义修复全流程通过 | in_progress |
| UI-28 状态栏、Report 与长任务反馈 | CORE+QUALITY+KERNEL | UI-20、UI-22、UI-12、BYB-05 | 预选/坐标/单位/命令提示、进度/取消、未保存状态、错误和 Report 入口对齐Worker 保存/导入/重算的完成、失败、取消和 stale 都能确定清理 | in_progress |
| UI-29 FreeCAD 使用流程逐工作台回放 | 各工作台 owner+IO+QUALITY | UI-23..UI-28 | 对核心与已声明 compatible 工作台执行新建/打开、切换、创建、选择、Task、属性编辑、重算、Undo/Redo、保存重开、导出每步比较命令状态、活动标签、选择、树、属性、视图和诊断 | pending |
| UI-30 UI/交互闭包与差异矩阵 | QUALITY+ORACLE+全体 owner | UI-19..UI-29、QA-03、QA-08 | Chrome 桌面/窄屏视觉、Pointer/Keyboard、Accessibility Tree、locale/长文本和跨工作台录制全部通过;生成 UI 能力/差异矩阵,零未登记差异、零遮挡、零无名控件、零阻断流程后才可标记完成 | pending |
### 18.3 连续执行与门禁
执行顺序为 `UI-19 -> UI-20/UI-21 -> UI-22 -> UI-23/UI-24 -> UI-25/UI-26/UI-27/UI-28 -> UI-29 -> UI-30`。同一阶段允许按 owner 并行,但每个上游交付后立即领取下一项,不等待另行确认。工作台任务只消费版本化 Facade 命令、对象 schema 和选择合同;页面不得直接访问 OCCT、Three.js、SQLite 或 OPFS 业务 API。
每项至少需要 FreeCAD 1.1.1 GUI oracle、Chrome 真实交互回放、桌面与 390px 窄屏截图、成功/失败/取消状态、键盘与焦点证据、无遮挡/溢出检查和无障碍名称检查。UI-30 还必须确认任务结束后 TaskSession、Worker 请求、ShapeHandle、临时资源和对话框焦点陷阱全部释放。未取得完整 GUI oracle 前,只能标记 `in_progress`,不能用静态源码、当前页面截图或 headless `FreeCADCmd` 证据标记 `completed`
### 18.4 本轮已落地证据2026-08-07
- 工作区改为 FreeCAD 桌面式紧凑层级应用菜单、标准工具栏、按命令组生成的工作台工具栏、MDI 文档标签、左侧 Combo ViewModel/Tasks、中央 OCCT/Three.js 视口、右侧 Selection View、Report/Jobs/Diagnostics 和状态栏;左右 Dock 可显式折叠。
- File/Edit/View/Tools/Macro/Windows/Help 菜单具备 `menu/menuitem` 语义、外部点击和 Escape 关闭;命令搜索统一展示菜单/工作台命令Preferences、About、Macro、关闭/删除确认使用 `aria-modal` 对话框和桌面式按钮区。
- 模型树支持对象选择驱动的右键菜单,包含可见性、重命名、重算和带依赖提示的删除确认;任务命令自动切换 Combo View 的 Tasks保留 Apply/OK/Cancel 和已有 Facade 事务。
- Chrome 150 生产 E2E 新增 `freecad-menus``command-search-dialog``preferences-about-dialogs``model-tree-context-menu`File 7 项、命令搜索 18 个结果、Preferences `3 select + 2 checkbox`、模型树 4 项上下文命令、Part Design 5 个工具栏组;桌面 `1440x1000` 无横向溢出OCCT canvas `892x679`、27 色、WebGL error 0390px 启动页无溢出162 个 AX 节点中的 16 个控件全部具名。
- `build`、167 项 Facade 测试、230 项单元测试、13 条 Chrome 工作流、3 张有效 PNG、质量闭环、现有 10 项 release closure 和 `git diff --check` 均通过。新增 CAM 工作流验证 60 个菜单/工具栏命令、4 个工具栏组、5 个菜单组、Job/Fixture/Tool/Operation/ToolBit Load/Drilling/Drag Knife/Post 5 轴 Task、7 行 Job 树及三维刀路;此前 `verify` 曾在发布产物生成处因缺少签名环境而 fail-closed现已通过受控本地 Ed25519 密钥重新生成清单并由公钥验签,禁止复用旧签名宣称新构建已签名。
当前 UI 波次为 `0 completed / 10 in_progress / 2 pending / 0 blocked`。未关闭项不是样式返工UI-19 仍需可自动化的完整 FreeCAD GUI oracleUI-20..UI-28 仍需按该 oracle 补齐动态禁用、全部对话框、视口/多选上下文、坐标预选和焦点陷阱UI-29/UI-30 等待逐工作台回放和零未登记差异闭包。
## 19. CAM 完整对标执行波次CAM-21..CAM-32
P09 的 `CAM-ALL=completed` 表示原 WBS 定义的 Job/Stock/Tool/Operation、碰撞负例、仿真和确定性 G-code 兼容门已经通过,不表示网页端已经等价实现 FreeCAD CAM/Path 的全部算法、对象模型、界面和机床验证。本波次继续锁定 FreeCAD `1.1.1`、提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`;能力口径由 `config/freecad-cam-parity.json` 管理,`check:cam-parity` 同时校验 FreeCAD GUI 清册、浏览器 CAM 报告和真实应用 E2E。FreeCAD 清册含 56 个 runtime CAM 命令和 5 个 source-only 注册,除 `CAM_%s` 动态模板外,当前 Web 已暴露全部 60 个可操作命令。除静态命令 ID/分组清册外,当前能力统一标记为 `compatible/development`,不得宣称 exact。
### 19.1 已落地的浏览器 CAM 合同
- CAM 工作台提供 FreeCAD 命名的 60 个可操作命令、4 个工具栏组和 5 个菜单组Combo View 中显示 Job、Model、Stock、SetupSheet、Tools/Controllers、Operations命令进入对应的 Job/Tool/Operation Task保留 Apply/OK/Cancel。
- Job 支持从模型包围盒、创建方盒、创建圆柱和选择现有实体 4 种 StockSetupSheet 提供快速进给、安全/间隙高度、深度表达式和 coolantToolBit 覆盖 End Mill、Ball End、Bull Nose、Drill、V-Bit、Thread Mill、Probe 7 种形状及控制器进给/主轴参数。
- Facade 登记 Profile、Pocket、Contour、Mill Face、Helix、Adaptive、Slot、Drilling、Tapping、Engrave、Deburr、V-Carve、Pocket 3D、Surface、Waterline、Thread Milling、Probe、Area、Area Workplane、Custom、Shape、Path Shape Tool Controller 共 22 种工序,以及 Array、Axis Map、Boundary、Dogbone、Drag Knife、Lead In/Out、Ramp Entry、Holding Tags、Z Correct 共 9 种 dress-up。
- 三维视口渲染按工序着色的刀路Chrome CAM harness 实际生成 2 把刀、2 个控制器、3 个工序、23 个路径点和 1 个 dress-up通过 Sanity、无碰撞正例和 1 个碰撞负例。GRBL、LinuxCNC、Mach3/Mach4、Centroid、Marlin、MASSO G3、Snapmaker 7 个 allowlisted post 均生成稳定 SHA-256未知 post 显式拒绝。
- Chrome 150 应用回放覆盖 13 条流程CAM 流程验证 60 个 CAM 菜单项、Job/Fixture/Tool/Operation/ToolBit Load/Drilling/Drag Knife Task、7 行 Job 树、5 个三维刀路点、图例、零横向溢出和零页面错误。独立 CAM 报告还验证 23 点材料去除时间线、夹具碰撞、sqlite-opfs 往返、marker 删除及释放后 `ShapeHandle/kernel reference=0/0`
### 19.2 任务分配与连续执行
| 任务 | Owner | 依赖 | 交付与验收 | 状态 |
|---|---|---|---|---|
| CAM-21 FreeCAD CAM 命令与分组清册 | ORACLE+PLATFORM | UI-19、INV-03 | 锁定 InitGui/命令注册来源60 个可操作 Web 命令均映射 FreeCAD 清册,其中 56 个 runtime-probed、4 个 source-only`CAM_%s` 动态模板单独排除,基线漂移自动失败 | completed |
| CAM-22 CAM 工作台、菜单、工具栏与 Job 树 | CORE+PLATFORM | CAM-21、UI-20..UI-23 | 4 工具栏组、5 菜单组、60 个可操作命令、Combo/Task/Property/视口刀路已落地;仍需完成动态可见/启用和完整 Qt 截图/焦点 oracle | in_progress |
| CAM-23 Job、Stock 与 SetupSheet 浏览器合同 | PLATFORM | CAM-21、CAM-22 | 4 Stock mode、尺寸/边界、快速进给、安全/间隙高度、深度和 coolant 有成功/失败/持久化证据 | completed |
| CAM-24 ToolBit、Library 与 Tool Controller | PLATFORM+IO | CAM-23 | 7 种刀具、控制器、刀号、feed/rapid/spindle/coolant、holder 尺寸字段、版本化 JSON ToolBit Load/Save仍须补齐 FreeCAD ToolBit asset schema、库迁移、holder 原生几何和全量编辑 oracle | in_progress |
| CAM-25 全工序 Path 算法对标 | PLATFORM+KERNEL | CAM-23、CAM-24、TSN-09 | 22 种浏览器工序已有确定性兼容实现;须逐工序与 FreeCAD 原生 Path 几何、进退刀、深度、方向、失败诊断及拓扑引用比较 | in_progress |
| CAM-26 Dress-up 与路径修改对标 | PLATFORM+TOPO | CAM-25 | 9 种 dress-up、Copy/Array/Toggle 生命周期已有合同;须补齐原生 Path dress-up 参数、组合顺序和 TopoRef oracle | in_progress |
| CAM-27 仿真、材料去除与碰撞 | PLATFORM+KERNEL | CAM-25、CAM-26 | 已有去重扣料的 browser-raster 时间线、feed 时间、holder-stock/cutter-fixture/holder-fixture swept envelope、侵入量/间隙和 Fixture Task仍须以原生实体布尔去料、OCL/Path 与刀柄/夹具几何 oracle 对照 | in_progress |
| CAM-28 后处理与 G-code 安全 | PLATFORM+QUALITY | CAM-24、CAM-25 | 7 个 allowlisted post、稳定哈希和非法 post 拒绝;须补齐 FreeCAD post 参数/单位/机床差异、控制器 golden 与生产 dry-run | in_progress |
| CAM-29 CAM 文档、Undo/Redo 与 FCStd | IO+DOC+PLATFORM | CAM-23..CAM-28、FC-10 | 版本化 Job JSON 已覆盖 Stock、SetupSheet、ToolBit/Controller、Operation/Dress-up、路径、Fixture 和材料设置,具备受限导入、同身份重开及 Undo/RedoFreeCAD 原生 Path::Feature/FeaturePython save/open/mutate/save/open 与 Web `Path::PropertyPath` 原生 Path::Feature 命令资源编辑已由 oracle 通过FeaturePython/full operation-object 语义仍有边界 | in_progress |
| CAM-30 Task、选择、键盘与对话框 | CORE+TOPO+QUALITY | CAM-22、CAM-24..CAM-28、UI-23..UI-28 | 原生 Qt 已验证 Job/Profile Task 的 setEdit、OK/Cancel、14 个字段和关闭生命周期;完整 selection provider、base geometry、键盘/焦点、错误/警告和全部工序对话框仍需对照 | in_progress |
| CAM-31 OpenCamLib/CAMotics 与 4/5 轴 | PLATFORM+KERNEL | CAM-25、CAM-27 | OCL WASM、CAMotics source-stage G-code、CAMotics 1.3 原生 Qt/TPL 与 CLI sidecar、standalone sweep WASM、OCCT 实体去除(含 continuous-segment sweep和 LinuxCNC XYZBC RTCP post/bridge 已接入;完整浏览器程序/同输入差分、FreeCAD 全工序算法和连续工具轴完整 oracle 仍须关闭 | in_progress |
| CAM-32 exact 闭包与机床认证 | QUALITY+ORACLE+全体 owner | CAM-21..CAM-31 | XYZBC 数字机型已按 CAD→OCL→CAMotics→G-code→LinuxCNC WASM 顺序完成 dry-run/run 接受6 个 LinuxCNC INI 的生产安全矩阵保持 fail-closed`productionOpen=false`。FeaturePython/full Path 语义、CAMotics GUI/浏览器同输入差分、泛化工具轴/奇异点、机型专属生产认证仍阻止 exact 声明 | in_progress |
连续依赖链为 `CAM-21 -> CAM-22/CAM-23 -> CAM-24 -> CAM-25 -> CAM-26/CAM-28 -> CAM-27 -> CAM-29/CAM-30 -> CAM-31 -> CAM-32`。当前 CAM 波次状态为 `8 completed / 4 in_progress / 0 pending / 0 blocked`;本轮增加的 FreeCAD Path oracle、OCL/CAMotics source-stage、OCCT、LinuxCNC bridge 和 XYZBC 数字机床证书均已登记,剩余差异保持显式。
### 19.3 明确未关闭的 exact 差异
当前还缺少六类关键证据FreeCAD 全工序 Path 算法及几何语义、完整 CAM Qt Task 的选择/焦点/键盘/校验 oracle、CAMotics 完整浏览器程序及同输入三轴差分、解析任意曲线的无弦误差扫掠及刀柄/夹具碰撞 oracle、连续工具轴全姿态/奇异点 golden、FeaturePython/完整 operation-object 的 Web `Path::PropertyPath` 语义往返。LinuxCNC WASM G-code bridge 已成为唯一解析/控制器入口;安全矩阵只证明 fail-closed不打开生产授权也不替代实体执行器/计量认证。
## 20. 系统级 FreeCAD exact 执行波次EX01..EX10
既有 P01..P10 的 `83/83 completed` 是已声明浏览器兼容范围的发布闭包,不是 FreeCAD 全系统 exact。系统 exact 的唯一机器计划改由 `config/freecad-web-exact-parity-plan.json` 管理,锁定 FreeCAD `1.1.1` 与提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`。该计划逐项覆盖 34 个模块、15 种格式、6 类入口,任何遗漏、未知依赖、循环依赖、缺失阻断原因或提前 exact 都由 `check:freecad-web-exact-parity-plan` 拒绝。
| Program | 范围 | 任务状态 | 首要交付 |
|---|---|---:|---|
| EX01 | 全量 runtime/GUI oracle 与可选依赖 | 0 completed / 2 in progress / 1 pending | 每个 TypeId、Property、Command 和失败状态都有原生证据 |
| EX02 | OCCT、逐阶段历史、MappedNameRef/StringHasher、同构消歧 | 1 / 3 / 2 | 每个 builder 有原生 stage Shape/history/naming无证据继续 fail-closed |
| EX03 | App 文档、属性、事务、表达式、跨文档与参数 | 0 / 4 / 1 | 原生对象图、observer 顺序、失败恢复和多文档生命周期一致 |
| EX04 | Sketcher、Part、PartDesign | 0 / 4 / 1 | 全几何/约束/特征/参数组合及 native naming 差异为零 |
| EX05 | FCStd 与全部 15 种格式 | 0 / 4 / 1 | 支持对象可编辑双向往返;代理格式显式排除出 exact claim |
| EX06 | 完整 GUI、Task、属性、选择、快捷键与工作流 | 0 / 4 / 1 | 动态 enable/visible/focus/validation 与 FreeCAD GUI oracle 一致 |
| EX07 | Draft、TechDraw、Spreadsheet、Plot | 0 / 4 / 1 | 对象、命令、跨工作台引用和导出完整往返 |
| EX08 | Assembly、BIM、Surface、Mesh、Material | 0 / 4 / 1 | 求解、IFC、曲面/网格算法和材料语义原生对照闭合 |
| EX09 | FEM、CAM、Robot、Points/RE、Inspection、脚本、插件、proxy 模块 | 0 / 6 / 3 | 全 Path/FEM/数据算法与安全 Python/addon 策略;五个 proxy 被实现或排除 |
| EX10 | 跨浏览器、A11y、locale、可靠性和 exact 发布 | 0 / 2 / 2 | 34 exact 模块、所有零差异指标和签名发布同时满足 |
详细的 52 项任务均包含 `priority/status/dependencies/deliverables/acceptance/evidence/exactBlockedBy`。执行关键路径为:
1. `EX-ORA-01 -> EX-ORA-02 -> EX-KER-01`,先扩展原生证据,禁止用 Web 当前行为自证。
2. `EX-TSN-00 -> EX-TSN-01 -> EX-TSN-02/03 -> EX-TSN-04`,闭合逐阶段历史、私有 token 证据和同构来源。
3. `EX-DOC-01..05 -> EX-SK/PART/PD -> EX-FC/FMT`,完成对象、特征和文件语义。
4. `EX-UI-01..05` 与 EX07..EX09 按依赖推进,逐工作台比较成功、失败、取消、保存重开和资源释放。
5. `EX-QA-01..03 -> EX-REL-01` 最后执行;不得通过修改 capability 文本绕过任何上游任务。
当前总状态为 `1 completed / 37 in_progress / 14 pending / 0 blocked`。唯一 completed 的 exact 子任务是 `EX-TSN-00`:缺少原生 MappedNameRef/StringHasher、逐阶段 builder 或唯一同构来源时硬失败或保持 ambiguous。系统 `exact=false`,直到 `EX-REL-01` 同时确认 52/52 completed、34/34 exact、错误绑定/未解释关系/名称漂移/未知语义差异/证据缺失/发布阻断全部为零。
Promotion 还必须经过 `check:freecad-web-exact-promotion`:它要求结构化 `config/freecad-web-exact-promotion-report.json`,并拒绝仅修改 `compatibility-matrix.json``claim.exact` 的人工提升。当前报告不存在是正常状态,因为 `EX-REL-01` 尚未完成;门禁必须输出 `freecad-web-exact-promotion-fail-closed`
七阶段执行细节、命令顺序、退出条件和报告示例见 `docs/freecad-exact-promotion-runbook.zh-CN.md`;机器字段契约见 `config/freecad-web-exact-promotion-report.schema.json`

View File

@@ -269,7 +269,7 @@ Bitbybit 必须被充分用作几何、Worker、IO、三角化和缓存的首选
| P0-01 | `IN PROGRESS`:已固定 FreeCAD 源码提交、原生编译器/依赖版本、无界面 Part 构建脚本与产物哈希;依赖镜像 digest 尚未完成 | lock、容器、构建日志 | 同一输入产生相同版本信息 |
| P0-02 | 生成 UI/命令/对象/Property/工作台 manifest | JSON manifest | 每条能力有来源和等级 |
| P0-03 | `IN PROGRESS`声明式契约、FreeCADCmd driver/比较器和首批 5 个 Part 成功样例已通过100 个黄金文件与 50 个错误文件尚未达到 | fixtures、expected | 桌面结果可复现 |
| P0-04 | 固定浏览器能力矩阵和 COOP/COEP | browser matrix | Chrome/Firefox/Safari 最新两个版本有结果 |
| P0-04 | 固定浏览器能力矩阵和 COOP/COEP | browser matrix | Chrome 最新两个版本有结果 |
| P0-05 | 许可证、供应链、WASM 安全评审 | SBOM、许可证清单 | 无未知二进制和高风险漏洞 |
| API-01 | Facade API 版本化和 JSON Schema | `src/facade` 合同 | 破坏性变更有迁移和弃用期 |
| API-02 | 统一请求上下文、取消、进度和诊断 | protocol types | 过期结果无法提交 |
@@ -283,7 +283,7 @@ Bitbybit 必须被充分用作几何、Worker、IO、三角化和缓存的首选
| GEO-04 | 几何精度、容差和确定性 | tolerance policy | 体积/面积/拓扑黄金稳定 |
| QA-01 | 单元/属性/解析器/图算法测试 | tests | 分支和错误分类达标 |
| QA-02 | FreeCAD CLI/GUI 回放对照器 | comparator | 差异含输入、版本、对象和数值 |
| QA-03 | 浏览器 E2E、视觉和几何黄金 | Playwright fixtures | 三浏览器能力结果可审计 |
| QA-03 | 浏览器 E2E、视觉和几何黄金 | Playwright fixtures | Chrome 能力结果可审计 |
| QA-04 | 性能/内存/取消/恢复压力 | benchmark reports | P95、峰值内存、失败率达门槛 |
| QA-05 | 安全测试和 fuzzing | corpus/reports | 文件、表达式、Worker 消息不可越权 |
@@ -333,7 +333,7 @@ Bitbybit 必须被充分用作几何、Worker、IO、三角化和缓存的首选
属性领域合同现覆盖标量、枚举、颜色、Vector、Placement、ObjectLink、ObjectLinkList/StringList 和版本化 SubshapeLink。Placement/Vector 使用结构化值并做有限数、角度范围及非零旋转轴校验,复合值深拷贝进入 Undo/Redo 与持久化。Facade 的对象级几何重算已在 Shape 生成后执行 Placement并对恒等变换、畸形结构、变换失败释放和最近有效缓存保留给出测试证据这不是 FreeCAD Body/Tip、Support、AttachmentOffset 或特征局部坐标链的等价实现File/Shape 摘要和多选 mixed 编辑也仍未完成。
TSN 已完成面/边/顶点量化签名、唯一/重复候选判定和匹配 API并挂接到实际重算 generation。成功 Shape 会产生对象拓扑快照、迁移 matches`signature-fallback` 历史;提交阶段自动写回 LinkSub 与草图外部几何,稳定引用更新 generation歧义/删除引用保持显式状态、标脏所有者并产生修复诊断。候选替换 Facade 事务验证当前拓扑和 kind 后原子写入 stable TopoRef重建 DAG、进入 Undo/Redo属性面板和诊断页均通过 Facade 调用。schema v6 保存快照。当前仍没有 OCCT 原生历史、曲线/曲面参数签名、邻接图、跨 Boolean 原生映射或 3D 候选高亮,因此 TSN-03、TSN-07/09 与完整 TSN-08 仍未完成
TSN 已完成面/边/顶点量化签名、邻接指纹消歧和匹配 API并挂接到实际重算 generation。成功 Shape 会产生对象拓扑快照、迁移 matches`signature-fallback`/`occt-native` 历史和 schema v1 ElementMap;提交阶段自动写回 LinkSub 与草图外部几何,稳定引用更新 generation歧义/删除引用保持显式状态、标脏所有者并产生修复诊断。候选替换 Facade 事务验证当前拓扑和 kind 后原子写入 stable TopoRef重建 DAG、进入 Undo/Redo属性面板和诊断页均通过 Facade 调用。schema v6 保存快照。Three.js 已支持多对象 Mesh 注册、OCCT analytic 面/边/顶点点击、预选、完整边折线高亮、window/crossing 框选和诊断聚焦闪烁;普通单向 Pad/Pocket/Revolution/Groove 已接入已有 OCCT `Generated/Modified/Deleted` provider其余复合模式仍显式回退
Sketcher 已有 Facade 事务模型和基础求解器适配器Sketch 几何/约束快照进入 `DocumentObjectSnapshot`,新增几何、约束和求解会更新 `ConstraintStatus`、历史、自动保存与 SQLite schema v4基础约束现覆盖 Diameter、Symmetric、Tangent。该适配器的职责是验证数据模型和提供可替换协议它不宣称已经等价于 FreeCAD `planegcs`。SK-03 的 planegcs WASM、SK-07 的完整约束分类、SK-09 的交互回放和 SK-10 的 B-spline 仍是兼容门禁。
@@ -366,17 +366,17 @@ PartDesign Mirrored 已形成 experimental whole-shape 垂直切片Facade 验
| P1-02 命令准确性 | manifest 仍可完整展示Part `primitive/union/cut/intersection` 与 Part Design 核心命令已有 Facade executor命令状态同时检查工作台和对象类型选择谓词其余未接入 executor 的命令返回 disabled 与 `COMMAND_UNIMPLEMENTED`,不再静默完成 | Part 基本体/布尔 Shape 缓存、选择不兼容时的禁用原因、`additive-loft` 未实现状态与诊断测试通过 | 其余工作台要逐项增加真实 executor、Task 参数和黄金回放后才能启用 |
| P3-05 Pattern 实验切片 | `linear-pattern``polar-pattern` 通过 Part Design 选择谓词、Task 和类型化属性创建对应对象Linear 按总 Length 等距平移Polar 在小于 360° 时覆盖首末角、360° 时不复制重合端点;两者均由 OCCT union 合并并释放临时副本 | 线性间距/方向、圆周完整/部分角度分布、联合输入、句柄释放、非法参数诊断、Base 链接、Body.Tip、属性校验和任务提交回归测试通过 | 当前为 FreeCAD 1.0+ 的 Transform body 近似,只复制整个 Base Shape未实现 Transform tool shapes、连接单实体过滤、稳定 TopoRef、历史映射、反向轴和引用轴因此保持 `experimental` |
| P3-07 MultiTransform 实验切片 | `multi-transform` 使用结构化有序 Linear/Polar/Mirrored 步骤Task 与属性面板共用编辑器;重算逐步扩展 whole-shape 实例并最终 union限制最多 6 步和 100 个组合实例 | 6 实例组合、方向/平面映射、故障注入、中间 Shape 完整回收、最近有效缓存、深拷贝、Undo/Redo、fallback 保存恢复与任务提交测试通过 | 不是 FreeCAD 局部 Transform feature history未实现特征列表、Datum/TopoRef 轴面、单实体规则与原生拓扑历史,保持 `experimental` |
| P3-05 Hole 基础切片 | `hole` 创建 `PartDesign::Hole`,用 32 边圆形 Profile 调用现有 OCCT Pocket支持 Diameter、Depth 以及 Dimension/Through all校验正尺寸并纳入 Base 链接和 Body.Tip | 圆孔 Profile、有限深度调用、非法直径诊断、Task 属性提交和 Tip 更新测试通过 | 仅为基体原点 XY 面、+Z 法向的直孔;草图圆/面定位、沉孔、锪孔、钻尖、螺纹、尺寸标准和稳定支撑面引用仍待实现,保持 `experimental` |
| TSN-02/05/06/08 TopoRef 基础迁移 | `topologyReferences` 提供 schema v1 创建、序列化、安全解析、解析和跨版本迁移;重复几何候选 ID 唯一,一旧多新不会错误继承;匹配按 kind 隔离并用形状尺度归一化几何评分支持纯平移 | round-trip、瞬时索引拒绝、resolved/ambiguous/deleted、重复拆分和纯平移回归测试通过 | 仍是网格签名启发式;没有 OCCT Generated/Modified/Deleted、邻接/曲率签名、布尔历史和黄金模型规模验证,不得提升为 compatible |
| TSN-08/09 LinkSub 文档接线 | `PropertyValue` 支持 schema v1 TopoRef重算 generation 自动迁移 LinkSub/草图外部几何,歧义/删除不强绑schema v6 保存对象拓扑快照Facade 候选替换事务验证当前同 kind persistentId重建 DAG 并支持 Undo/Redo属性/诊断 UI 可替换;Pocket 暴露 `UpToFace` | 非法瞬时索引/候选拒绝、DAG 边、稳定/歧义/删除迁移、跨 generation 回退解析、候选替换、Undo/Redo、保存加载和 67 项全套测试通过 | 尚未从 3D 拾取、预选或高亮候选Pocket Up to face executor 仍保持结构化 unsupported等待原生面历史/解析接线 |
| TSN-03/07 历史适配器回退 | Bitbybit 1.1.1 绑定仅有 `HasGenerated()`,没有逐 Shape 的 Generated/Modified/IsDeleted`signature-fallback` 已进入真实重算 generation对每个成功 Shape 保存快照/matches/history采集失败释放临时 Shape并保留最近有效缓存 | 平移修改、新增/删除/重复面、跨对象竞争、generation 写回、采集失败隔离和持久化测试通过;全套 63 项测试通过 | 此 provider 不是 OCCT history多输入 Boolean 当前仍缺逐输入原生映射,只有自构建绑定暴露逐子形状历史并通过黄金模型后才能将 TSN-03/07 标为完成 |
| P3-05 Hole 基础切片 | `hole` 创建 `PartDesign::Hole`,用 32 边圆形 Profile 或圆锥刀具调用现有 OCCT Pocket/Cut;支持 Diameter、DepthType/Depth、Position/Direction、Reversed、Flat/Angled DrillPoint、DrillForDepth、Tapered/TaperedAngle 以及 Dimension/ThroughAll校验正尺寸并纳入 Base 链接和 Body.Tip | 圆孔 Profile、有限深度调用、位置/方向、90 度基准锥度、包含钻尖总深度、非法直径/方向诊断、Task 属性提交和 Tip 更新测试通过Counterbore/Countersink/Counterdrill、Angled drill point 和 Tapered 由 Bitbybit 圆柱/圆锥刀具加 Boolean Cut 组合执行,并有 Chrome 非空 mesh 与 0/0 release 证据 | 仍未实现 Threaded/ModelThread、标准尺寸、Support/Profile 面定位和完整局部特征历史;螺纹保持显式 `HOLE_THREADING_UNSUPPORTED`,能力保持 `experimental` |
| TSN-02/05/06/08 TopoRef 基础迁移 | `topologyReferences` 提供 schema v1 创建、序列化、安全解析、解析和跨版本迁移;重复几何通过邻接指纹唯一消歧,一旧多新不会错误继承;匹配按 kind 隔离并用形状尺度归一化几何评分支持纯平移;对象快照附带 schema v1 ElementMap新增原生 ElementMap2 v1 token AST/schema v2 writer以及 StringHasher v1 AST/schema v2 codec | round-trip、瞬时索引拒绝、resolved/ambiguous/deleted、重复拆分、邻接唯一/对称回归、FaceN/EdgeN/VertexN 写出和持久化通过FreeCAD 1.1.1 的 30 模型、91 个 ElementMap2、11 个 StringHasher 表完成解析、写回和引用闭合 | Web 拓扑仍不能凭最终几何生成 FreeCAD 私有算法未提供的历史 token/StringID对称 Boolean 的同构子形需要原生候选证据才能消歧 |
| TSN-08/09 LinkSub 文档接线 | `PropertyValue` 支持 schema v1 TopoRef重算 generation 自动迁移 LinkSub/草图外部几何,歧义/删除不强绑schema v6 保存对象拓扑快照与 ElementMapFacade 候选替换事务验证当前同 kind persistentId重建 DAG 并支持 Undo/Redo属性/诊断 UI 可替换;Three.js 多 Mesh 场景已将对象/OCCT analytic 面边点拾取、预选、完整曲线折线高亮、诊断闪烁和 window/crossing 框选回调 FacadePocket 暴露 `UpToFace`Pocket/Groove/Hole/MultiTransform 及双侧线性/角度特征可携带内部 builder 的 STEP/topology/history stageElementMap2 writer 可从 MappedNameRef/StringID 证据生成 FreeCAD 1.1.1 tokenFCStd reader/writer 会校验 StringHasher 引用闭包 | 非法瞬时索引/候选拒绝、DAG 边、稳定/歧义/删除迁移、邻接消歧、候选替换、Undo/Redo、保存加载、无三角对角线的 BRep 边拾取、多选集合、真实双对象穿越框、诊断聚焦事件、live ElementMap、Pocket 双侧、Revolution/Groove 双角 Chrome 回放及 30 模型 naming-evidence gate 通过 | 未提供逐阶段 Shape/history 或 MappedNameRef/StringHasher 证据的算法继续保守回退;同构子形无唯一原生证据时不宣称 exact |
| TSN-03/07 历史适配器回退 | Bitbybit 1.1.1 绑定仅有 `HasGenerated()`,没有逐 Shape 的 Generated/Modified/IsDeleted独立 native provider 已接入普通及双侧 Pad/Pocket/Revolution/Groove 参数路由与既有 Boolean/Pattern/Dress-up 子集;协议新增显式 input/stage、sourceStage/resultStage、一对多 resultIndexes、有序 feature sides 和 rotate stage可向后兼容旧 object/tool 载荷stage capture 按各自产生结果解释 index 并以邻接唯一性约束同构候选 | 平移修改、新增/删除/重复面、邻接唯一消歧、跨对象竞争、generation 写回、采集失败隔离、Up-to-face 有效距离、Two sides/Midplane/Two angles 路由通过Groove 双角按 FreeCAD profile offset + 单 sweep + Cut 得到 native valid 单 solid30 模型 history/ElementMap2/StringHasher exact gate 与 Facade `182/182` 通过 | provider 仍通过 STEP/BREP 跨 WASM同构候选和未提供私有 builder/命名证据的算法仍需逐项黄金模型后才能声明 exact |
原生历史 provider 适配器现已进入重算执行器:当 Geometry Worker 暴露 `topologyHistory()` 且 Base/Tool/Profile 有拓扑快照时Facade 将真实输入/输出 Shape 和记录交给 `captureNativeTopologyHistory()`;否则保守回退。该适配层有独立单测,但当前 Bitbybit 1.1.1 provider 仍未提供真实记录,因此 TSN-03/07 仍不能标记完成
原生历史 provider 适配器现已进入重算执行器:当 Geometry Worker 暴露 `topologyHistory()` 且 Base/Tool/Profile 有拓扑快照时Facade 将真实输入/输出 Shape 和记录交给 `captureNativeTopologyHistoryStages()`,再由 `composeNativeTopologyHistoryLineage()` 把上游对象 stage 接入当前关系;普通 Pad/Pocket/Revolution/Groove、Up-to-face 有效长度以及双侧/Midplane/Two angles 会进入同一参数协议。Pocket、Hole、MultiTransform 和双侧 builder 保存中间 STEP/拓扑/记录Groove TwoAngles 按 FreeCAD 语义保存 `rotate -> revolution -> cut` 的 BREP/history并已通过 native BRepCheck Chrome 黄金门。provider 不声明组成 operation 时保留单响应兼容路径。exact 判定仍必须同时拥有逐阶段 Shape/history 与 MappedNameRef/StringHasher 命名证据,任一缺失都不能由最终几何补推
后续按以下顺序连续开发:
1. `P4-06/DAG-08`:同步/异步重算已共享抑制传播和根因诊断语义并支持定位、解除错误后的最小闭包重算与合法特征抑制继续补齐多配置抑制、Body Tip 重定向、最近有效 Shape 显式回滚和性能计数器。Shape 缓存已进入 Facade但尚未持久化。
2. `P3-04/P3-05`Pad/Pocket/Revolution/Fillet/Chamfer 已有 OCCT Worker 输入适配和 Shape 缓存回写Pocket Through all 已接入Linear/Polar Pattern 与原点法向直孔已完成实验切片;继续补齐 Up to face、局部特征/拓扑历史及 Hole 高级形态,未完成能力保持 disabled 或 experimental。
2. `P3-04/P3-05`Pad/Pocket/Revolution/Fillet/Chamfer 已有 OCCT Worker 输入适配和 Shape 缓存回写Up-to-face 实际距离、Part 双向 Extrude/Revolution、PartDesign Two sides/旧 TwoLengths 与 Revolution/Groove Midplane/Two angles 已进入原生协议Groove 双角的 FreeCAD 单 sweep 语义和结构有效性已闭合。继续扩展锥度逐阶段 history、局部 feature-list 重算、螺纹/标准尺寸及稳定 Support未通过黄金 Shape/history 的能力保持 compatible 或 experimental。
3. `TSN-03/07/08`TopoRef schema、面/边/点签名、基础迁移和歧义处理已落地;继续补齐 OCCT Generated/Modified/Deleted、邻接/曲率签名、跨布尔历史和数据库属性接线;任何 transient index 不得写入持久引用。
4. `SK-03/SK-06/SK-07`:编译和验证 planegcs WASM按基础/高级约束建立 FreeCAD 黄金回放;基础 solver 维持 experimental。
5. `P2-04/P2-05/P2-06`:完成保存点恢复报告、迁移回滚、配额回收和 BroadcastChannel 单写者冲突。
@@ -384,3 +384,25 @@ PartDesign Mirrored 已形成 experimental whole-shape 垂直切片Facade 验
7. `P6-03/P8-02`:把 disabled 原因、重算进度/取消、FCStd 报告和能力矩阵接入 React并通过目标浏览器回放和视觉基线。
启用规则:`RecomputeExecutionResult.status=completed` 只表示已注册节点成功FCStd `metadata-compatible` 只表示安全元数据可读;只有 FreeCAD 对照黄金测试、取消/失败/只读、保存/加载和跨浏览器门禁都通过,才能把对象或命令从 `experimental` 提升到 `compatible``exact` 还要求锁定版本后的逐项差异为零。
### 20. 命名证据与系统级 exact 评估2026-08-09
运行时命名证据必须来自 native provider 的 `MappedNameRef`/`StringHasher` 或逐阶段 builder capture。`NativeStageNamingEvidence` 对缺失证据写出 `final-shape-only`,对只有原始表而没有可重建回调的 FCStd 资源写出 `opaque-preserved`;两者都不能仅凭最终 Shape 生成新 FreeCAD token。跨阶段 ElementMap2 映射保存 `sourceStageId`、来源集合和 `ambiguous` 候选,校验失败直接阻断写回。
逐 feature 等级目前由 `config/compatibility-matrix.json``facadeCapabilities.geometry.featureLevels` 管理Pad/Pocket/Revolution/Groove/Boolean 为有 native history 子集的 `compatible`Fillet/Chamfer/MultiTransform 保持 `experimental``systemExactEvaluation.exact` 必须在所有 feature 的阶段 Shape/history、私有 token 证据和同构来源都闭合后才允许改为 true当前值固定为 false阻断项为私有 FreeCAD token 算法、没有原生 builder stage、以及无唯一同构来源。
### 21. 全功能 exact 计划2026-08-09
全功能对标不再沿用已经 `83/83 completed` 的 compatible 发布 WBS 作为完成判据。`config/freecad-web-exact-parity-plan.json` 建立 EX01..EX10、52 项 exact 任务,覆盖 34 模块、15 格式、6 入口,详细依赖和验收见 `docs/freecad-full-parity-execution-wbs.zh-CN.md` 第 20 节。优先顺序为原生 oracle -> kernel/history/naming -> document/property -> Sketcher/Part/PartDesign -> FCStd/formats -> GUI -> 生产/工程/平台工作台 -> 跨浏览器质量 -> exact 签名发布。
`check:freecad-web-exact-parity-plan` 与旧 execution-plan gate 一起进入默认 verify。开放任务必须保留 `exactBlockedBy`,完成任务必须具有已登记的可执行 evidence 且不能继续带阻断项34 模块和 21 个格式/入口必须逐项映射到任务。最终 `EX-REL-01` 只有在所有任务完成、34 模块均为 exact、八项零差异指标成立时才允许关闭。当前状态为 `1/52 completed`,系统仍为 `exact=false`
`check:freecad-web-exact-promotion` 进一步阻止直接编辑 `claim.exact` 或能力矩阵来“提升”版本:在 `exact=false` 状态只输出 fail-closed只有 `EX-REL-01` 完成并提交结构化 promotion report报告同时满足 52/52、34/34、八项指标全零和八类证据才允许 promotion gate 通过。
详细实施手册见 `docs/freecad-exact-promotion-runbook.zh-CN.md`,报告结构见 `config/freecad-web-exact-promotion-report.schema.json`。手册按七个阶段规定输入、任务、命令、退出条件和失败回退,防止把规划状态、兼容子集或静态清册当成 exact 证据。
### 22. 参数 mutation 与阶段命名证据闭合规则2026-08-10
EX-ORA-02 的 mutation corpus 由 `config/freecad-parameter-mutation-plan.json` 定义为五项独立证据nominal 参数、非法边界、两个以上显式参数快照、真实编辑-重算-恢复事务,以及无差异 FCStd 往返。`config/freecad-parameter-mutation-report.json` 必须由现有黄金证据生成,`check:freecad-parameter-mutations` 会逐字节重算并拒绝陈旧或手工提升的报告。当前只有 `1/35` family 完整,因此 EX-ORA-02 保持 `in_progress`
30 个复合模型的 219 个文档阶段已通过 FreeCAD 运行时 `getElementMappedName/getElementIndexedName/getElementHistory` 获得直接命名证据,并由两个门禁逐阶段验证。此处的 `native-evidence=219/219` 不等于内部 builder exact219 个阶段都有 IndexedName但只有 74 个阶段的全部子形有 MappedName145 个阶段只有原生索引身份;当前识别出的 42 个操作阶段仍为 `internalBuilderEvidence=0`。没有内部 builder Shape/history 时,最终几何不能用于制造中间 Generated/Modified/Deleted没有实际 StringHasher/MappedNameRef 时也不能制造私有 token同构候选没有唯一原生来源时继续持久化为 ambiguous。

View File

@@ -18,28 +18,38 @@
| 批次 | 任务范围 | 主要交付物 | 退出门禁 |
|---|---|---|---|
| R0 参考环境 | `BASE-01..04``INV-01..06` | 完整桌面 oracle 构建清单34 模块、命令、TypeId、Property、格式和错误清册 | 锁定提交可重建;清册无未登记入口 |
| R1 几何内核 | `BYB-03..08``TSN-03..10` | 可复现 Bitbybit/OCCT 构建浏览器原生历史Shape 生命周期;三方黄金差分 | Boolean/PartDesign 历史无静默错绑;长会话无泄漏 |
| R0 参考环境 | `ORA-01..02``INV-01..04``BASE-03..04` | 完整桌面 oracle 构建清单34 模块、命令、TypeId、Property、格式和错误清册 | 锁定提交可重建;清册无未登记入口 |
| R1 几何内核 | `BYB-03``BYB-05..08``BROWSER-OCCT-01``MEM-OCCT-01``TSN-03..10` | 可复现 Bitbybit/OCCT 构建浏览器原生历史Shape 生命周期;三方黄金差分 | Boolean/PartDesign 历史无静默错绑;长会话无泄漏 |
| R2 Sketcher | `SK-03..12` | planegcs WASM完整几何/约束/DOF/冲突;外部几何;编辑回放 | FreeCAD 草图成功/失败/冗余行为黄金通过 |
| R3 参数化核心 | `CORE-01..12``PART-*``PD-*` | Document/Property/DAG/Body/Tip/SupportPart 与 PartDesign 全特征 | 编辑→重算→Undo→保存→加载闭环通过 |
| R4 文件互操作 | `FC-04..11``PKG-*` | Document/GuiDocument、BRep/Shape、Expression/Link/TopoRef、未知字段保留 | FreeCAD→Web→FreeCAD 双向差异可解释且无静默丢失 |
| R5 核心工作台 | `TD-*``SS-*``DRAFT-*``PLOT-*` | TechDraw、Spreadsheet、Draft、Plot 的对象、命令、任务和格式 | 每命令至少成功/失败/round-trip fixture |
| R6 工程工作台 | `ASM-*``BIM-*``MESH-*``SURF-*` | 装配、BIM、网格、曲面全链路 | 求解/几何/IFC/网格黄金和大模型预算通过 |
| R7 分析制造 | `FEM-*``CAM-*``ROBOT-*``INSP-*` | 求解器/后处理/刀路/仿真/检测报告 | 求解或明确远端能力G-code/结果文件黄金通过 |
| R8 平台长尾 | `PTS-*``RE-*``OSC-*``IDF-*``JT-*``MAT-*``APP-*``SCRIPT-*` | 数据模块、插件、宏/API、桌面通用能力的实现或显式代理 | 无未分类入口;安全和权限模型通过 |
| R9 发布 | `QA-*``REL-*`、F0-F9/G0-G9 | 跨浏览器、性能、故障注入、安全、SBOM、迁移和发布 runbook | 所有阻断项关闭后才允许声明完整对标 |
| R3 参数化核心 | `CORE-09..11``PART-ALL``PD-BASE``PD-LOFT``PD-DRESSUP``PD-TRANSFORM``PD-CLOSURE` | Document/Property/DAG/Body/Tip/SupportPart 与 PartDesign 全特征 | 编辑→重算→Undo→保存→加载闭环通过 |
| R4 文件互操作 | `FC-04..11` | Document/GuiDocument、BRep/Shape、Expression/Link/TopoRef、未知字段保留 | FreeCAD→Web→FreeCAD 双向差异可解释且无静默丢失 |
| R5 核心工作台 | `TD-ALL``SS-ALL``DRAFT-BASE``DRAFT-OPS``PLOT-ALL``DOC-CLOSURE` | TechDraw、Spreadsheet、Draft、Plot 的对象、命令、任务和格式 | 每命令至少成功/失败/round-trip fixture |
| R6 工程工作台 | `ASM-CORE``ASM-TOOLS``BIM-CORE``BIM-IFC``MESH-CORE``SURF-CORE``ENG-CLOSURE` | 装配、BIM、网格、曲面全链路 | 求解/几何/IFC/网格黄金和大模型预算通过 |
| R7 分析制造 | `FEM-ALL``CAM-ALL``ROBOT-ALL``INSP-ALL` | 求解器/后处理/刀路/仿真/检测报告 | 求解或明确远端能力G-code/结果文件黄金通过 |
| R8 平台长尾 | `DATA-ALL``ADDON-ALL``SCRIPT-ALL``PLATFORM-CLOSURE` | 数据模块、插件、宏/API、桌面通用能力的实现或显式代理 | 无未分类入口;安全和权限模型通过 |
| R9 发布 | `QA-01..08``REL-01..04` | 跨浏览器、性能、故障注入、安全、SBOM、迁移和发布 runbook | G0-G9 和所有阻断项关闭后才允许声明完整对标 |
## 3. 当前立即执行队列
## 3. 当前执行波次
1. `ORA-01`:建立完整 FreeCAD 1.1.1 桌面/工作台 oracle 构建配置;探针必须区分编译缺失、导入失败和 GUI-only
2. `INV-02`:从 O1/O2 生成模块→命令→对象→属性→格式清册,并与 Web manifest 做机器差分。
3. `BYB-06/07`:在真实浏览器实例化原生历史 Worker执行 Bitbybit STEP→原生 OCCT→FreeCAD 三方 Boolean 黄金和内存释放测试。
4. `TSN-04/07/10`:补曲面/曲线/邻接签名,扩展 Boolean、Pattern 和 PartDesign 的逐输入历史,建立参数变异套件。
5. `SK-03/06/07`:编译 planegcs WASM按 FreeCAD 草图约束分类逐组替换基础 TypeScript solver。
6. `CORE-09..12``PD-*`:完成 Support/AttachmentOffset、Body 单实体、Tip 重定向、局部特征和编辑历史。
7. `FC-04..10`:在现有安全 ZIP 和属性投影上增加 GuiDocument、BRep/Shape、Expression/Link/TopoRef 与未知 XML/资源保留。
8. 按 R5→R8 顺序逐工作台交付,禁止只启用 UI 或把未实现命令标记为成功。
9. 每个增量持续执行 R9 门禁;能力等级只能依据本机 FreeCAD 黄金证据提升。
当前只将下表的 Wave A 作为立即开工集。Wave B/C 可先准备 fixture 和合同,但不能在前置门未通过时声称验收
| 波次 | 任务 | 可并行工作 | 退出条件 |
|---|---|---|---|
| Wave A解锁参考与浏览器内核 | `ORA-01``ORA-02``BYB-03``BYB-05``BROWSER-OCCT-01``BYB-06``BYB-05` 后并行 | 源码清册生成器、Worker 故障注入 harness、内存 telemetry 合同 | O2 可探针Chrome 能加载原生 Worker取消与崩溃可恢复 |
| Wave B建立可比较证据 | `INV-01..04``BASE-03``BASE-04``BROWSER-OCCT-01``BYB-07``MEM-OCCT-01/BYB-08` | 成功/失败 fixture 生产可按工作台分片 | 34 模块入口无漏项Fuse/Cut/Common 三方差异可解释1000 次压测达到内存预算 |
| Wave C关闭稳定拓扑 | `BYB-07``TSN-03/04``TSN-05/06``TSN-07/08/09``TSN-10` | `SK-03` planegcs 最小源图和 WASM POC | 100 模型/1000 参数变异无静默错绑;歧义和删除均可诊断 |
| Wave DSketcher 与参数化核心 | `SK-03..12``CORE-09..11``PART-ALL/PD-*` | `FC-04/07` 的未知数据保留可与核心对象映射并行 | 草图诊断与 FreeCAD 一致Part/PartDesign 七步闭环通过 |
| Wave E文件与工作台 | `FC-04..11`→P07→P08→P09 | P07/P08 在 G4/G5 后并行BIM 共享合同等待 Draft/Spreadsheet | FCStd 双向无静默丢失;每工作台创建、编辑、重算、撤销、保存、加载、导出通过 |
P10 不是最后才启动的波次:`QA-01/02/07` 从 Wave A 开始横切执行,其余 QA/REL 项在对应产物可用后立即纳入持续门禁。
### Wave A 首批交付顺序
1. 完成 GUI/34 工作台 CMake profile锁定依赖、构建参数、产物 hash 和重建命令。
2. 用 O2 实测模块导入、Gui 命令注册、选择前置和 Task 创建,不将静态候选提升为运行时能力。
3. 完成 Bitbybit/OCCT 绑定的可复现构建和 Worker 版本握手对请求实施取消、超时、stale generation 隔离和崩溃后重建。
4. 在 Chrome 中实例化 JS/WASM Worker记录 COOP/COEP、OPFS、CSP、产物 hash、启动时间和失败诊断。
5. 将 Worker 句柄账本与 JS heap、WASM memory 和 GPU 资源指标对齐,为 Wave B 的 1000 次 Boolean 门禁准备可量化基线。
## 4. 单项完成定义
@@ -49,7 +59,7 @@
2. Facade 合同、取消、过期结果、Undo/Redo 和诊断均有测试。
3. 几何/求解结果在声明公差内,拓扑引用不使用瞬时索引。
4. 保存、加载、版本迁移和相关格式 round-trip 无静默丢失。
5. Chrome、Firefox、Safari 目标版本的 Worker/OPFS/交互证据通过。
5. Chrome 目标版本的 Worker/OPFS/交互证据通过;其他浏览器测试延期至全部任务完成并收到明确通知
6. 内存、性能、安全、许可证和能力矩阵已更新。
`compatible` 允许已记录且可解释的浏览器差异;`exact` 要求锁定版本的声明语义无差异。无法在浏览器安全实现的桌面能力必须标为受限代理,不能隐藏。
@@ -66,3 +76,5 @@ jq empty config/compatibility-matrix.json
```
O2 完整桌面 oracle 建立后,所有相关探针和黄金命令必须显式设置 `FREECAD_CMD`,防止回退到仅含 Part 的缓存构建。
详细责任 lane、83 个任务、交付物、验收和交接合同见 [FreeCAD 1.1.1 全功能对标执行 WBS](freecad-full-parity-execution-wbs.zh-CN.md);机器可读任务真值为 `config/freecad-execution-plan.json`

View File

@@ -0,0 +1,20 @@
# BitBybit CAD Studio 发布 Runbook
基线FreeCAD `1.1.1`(提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`Chrome `150`COOP/COEP 隔离上下文sqlite-opfs 持久化。
## 发布前
1. 使用锁定 Node/npm 环境运行 `./npmw run verify`
2. 确认 `./npmw run check:release-closure` 输出 G0-G9 全部通过。
3. 受控本地发布使用 `.secrets/release-signing-private.pem`(权限 `600`,已被 Git 忽略)和默认 key id `bitbybit-local-release-2026`;先执行 `./npmw run check:release-signing-key`,再执行 `./npmw run build && ./npmw run generate:release-artifacts`。CI/发布机也可注入 `RELEASE_SIGNING_PRIVATE_KEY``RELEASE_SIGNING_KEY_ID`,入口会校验其 Ed25519 类型及与仓库公钥的一致性。
4. 只发布 `dist/``config/sbom.cdx.json``config/release-artifacts.json` 和对应公钥;私钥不得进入仓库或静态资源。密钥轮换必须同时更新受控私钥和 `config/release-signing-public.pem`,然后重新生成清单。
## 部署
保持 `Cross-Origin-Opener-Policy: same-origin``Cross-Origin-Embedder-Policy: require-corp``Cross-Origin-Resource-Policy: same-origin``Permissions-Policy` 和 CSP。Service Worker cache 名称由构建产物固定为 `bitbybit-cad-shell-v1`;哈希资源和 OCCT/SQLite WASM 必须存在于 precache。
## 升级、回滚与诊断
先保留旧 cache 和旧发布清单,再切换新版本。首装/升级/离线/缓存清理使用 `./npmw run test:chrome-offline` 复核;项目 schema 迁移与整事务回滚使用 `./npmw run check:project-migration``./npmw run check:chrome-opfs-migration`。若签名或 SBOM 校验失败,停止切换并回滚至上一份已签名清单;不得以 unsigned-development 产物替代。
出现 Worker/WASM 崩溃或 stale 结果时运行 `./npmw run check:chrome-fault-injection`,确认恢复状态和资源计数;出现格式/权限问题时运行 `./npmw run check:chrome-security`。浏览器不满足隔离或 OPFS 能力时显示明确降级/导出路径,不伪装为完整兼容。

View File

@@ -805,7 +805,7 @@ UI 兼容验收分三类:
### 7.4 浏览器支持
首发验证 Chrome/Edge、Firefox、Safari 的最新两个稳定大版本;明确 WebAssembly、WebGL2、Worker、OPFS 和 File System Access API 的支持差异。Safari 的 OPFS VFS 兼容性必须以实际版本测试为准,不能仅依赖能力探测
首发验证 Chrome 的最新两个稳定大版本;明确 WebAssembly、WebGL2、Worker、OPFS 和 File System Access API 的支持差异。其他浏览器测试延期至全部任务完成并收到明确通知
## 8. 文件格式与互操作
@@ -1296,7 +1296,7 @@ SQLite 是运行时的主存储,不要求项目包直接暴露数据库内部
| BitBybit/OCCT WASM 体积和重计算速度不足 | 高 | Worker、按需加载、缓存、简化显示设置模型规模上限和服务器后备路线 |
| Sketch 求解器移植成本超预期 | 极高 | 把求解器列为独立 POC先支持受限约束集保留服务化替换接口 |
| OCCT 拓扑命名导致链接丢失 | 高 | 自建稳定引用、特征映射、几何相似回退和明确的失效提示 |
| OPFS/Safari/多标签页差异 | 高 | 启动能力探测;单写者;备份和降级;跨浏览器回归 |
| OPFS/多标签页/目标浏览器差异 | 高 | 启动能力探测;单写者;备份和降级;Chrome 回归 |
| WASM/SharedArrayBuffer 受安全响应头限制 | 中 | 首发不强依赖线程化;部署模板统一 COOP/COEP检查第三方资源 |
| FCStd 兼容范围失控 | 高 | A/B/C 分档;不支持对象代理化;每个版本维护样例和差异报告 |
| 许可证和静态链接边界不清 | 高 | 在 POC 阶段完成 SBOM、NOTICE、动态/静态链接审查和法律确认 |
@@ -1349,7 +1349,7 @@ SQLite 是运行时的主存储,不要求项目包直接暴露数据库内部
5. BitBybit Viewport API 使用内部 Three.js 显示结果并支持面选择。
6. BitBybit Project API 使用内部 SQLite WASM + OPFS 保存参数树和 Shape 缓存。
7. 刷新后恢复项目,导出 STEP 和 `*.webcad`
8. 一组桌面 FreeCAD 对照模型、UI/业务差分、Facade-only 依赖检查和 Chrome/Firefox/Safari 烟测通过。
8. 一组桌面 FreeCAD 对照模型、UI/业务差分、Facade-only 依赖检查和 Chrome 烟测通过。
这个垂直切片通过后,再扩大特征数量、文件兼容范围和协作能力。若其中任一关键路径无法满足性能或兼容性预算,应在此里程碑处重新选择“浏览器本地优先、服务器几何后备”或“缩小 FreeCAD 业务范围”,而不是继续堆叠 UI 功能。
@@ -1595,7 +1595,7 @@ P0 基线/治理
| P1-06 Facade-only 依赖守卫 | `DONE` | `scripts/check-facade-boundary.mjs`,禁止 UI 绕过入口导入 Three.js/SQLite/OPFS/Worker |
| P4-01/P4-04 Document/Object 与事务最小切片 | `IN PROGRESS` | Pad/Pocket/Fillet/Chamfer 等已通过 Task 确认追加到 Body新增 Part Design 特征会原子更新 Body.Tip并按 Sketch/实体来源写入 Profile/BaseFeature 支持可持久化抑制、下游跳过、Shape 释放和解除后的最小闭包重算文档版本、dirty、Undo/Redo、异步重算 generation 和过期结果拒绝已接通;真实 Shape 事务、完整容器/Tip 重定向规则和原子崩溃恢复仍待实现 |
| P4-06 诊断树与修复动作 | `PASS (基础闭环)` | 同步/异步重算错误生成带文档版本、generation、根因对象和依赖路径的结构化诊断Facade 提供诊断树以及定位对象、合并当前 dirty 集后重算根因闭包、合法特征抑制动作循环不会错误提供抑制修复Diagnostics 页面通过 Facade 投影并执行动作;最近有效 Shape 显式回滚、复杂修复建议和性能计数器仍待实现 |
| P4-02 Property/Link/Unit | `IN PROGRESS` | DocumentObject 已携带 Data/View 类型化属性元数据;编辑经过 Facade 校验、版本、dirty、Undo/Redo、autosave 和 SQLite基础表达式/单位/Link DAG 已落地;`App::PropertyLinkSub` 使用版本化 TopoRef生成 `topo-ref` DAG 边并可保存加载。3D 子形状拾取、重算迁移写回、locale 和多选 mixed 仍待实现 |
| P4-02 Property/Link/Unit | `IN PROGRESS` | DocumentObject 已携带 Data/View 类型化属性元数据;编辑经过 Facade 校验、版本、dirty、Undo/Redo、autosave 和 SQLite基础表达式/单位/Link DAG 已落地;`App::PropertyLinkSub` 使用版本化 TopoRef生成 `topo-ref` DAG 边并可保存加载。3D 多 Mesh 对象/OCCT analytic 面边点拾取、预选、整条 BRep Edge 折线高亮、诊断闪烁和 window/crossing 空间框选已接入 Three.js/Facade模型树修饰键增删与 Visibility/Space 投影已落地;完整原生操作历史迁移写回、locale 和属性 mixed 仍待实现 |
| P2-01/P2-02 SQLite schema 与 Persistence Worker | `PASS (领域/压力门禁)` | schema v6 在 v5 checkpoints 基础上新增 `objects.topology_json`,保存 generation 拓扑快照;统一 migration runner 在一个事务中排序、跳过已应用版本并在失败时 rollback`PersistenceWriteQueue` 的 1000 次写入压力覆盖严格顺序、最大并发 1 和 8 次失败后的继续执行。实际 SQLite v4→v5→v6 浏览器升级演练仍须进入 E2E/发布矩阵 |
| P2-03 OPFS 资源管理 | `IN PROGRESS` | Worker 提供 SHA-256 内容寻址、引用计数、读取/释放;新增 5% 配额预留、重复内容免重写、缺失文件重建,以及数据库记录/OPFS 文件对账清扫报告。配额与清扫策略单测和生产构建通过;真实 OPFS 孤儿文件、QuotaExceeded 和大资源浏览器压力仍待验证 |
| Worker memory resource fallback | `PASS` | Worker 在 SQLite WASM 无 OPFS 时使用 transient content-addressed resource map保持 `put/get/release` 引用计数语义;不再把资源 API 错误地绑定到 OPFS |
@@ -1604,7 +1604,7 @@ P0 基线/治理
| P2-05 多标签页写入协调 | `DONE (降级可观测)` | `SqliteProjectPersistence` 在保存和资源写入外包 `navigator.locks` 独占锁,成功保存通过 `BroadcastChannel` 广播文档版本Facade 暴露 `project.subscribeExternalChanges()`;无 Web Locks 的运行时能力标记为 `local-queue`,不宣称跨标签页互斥 |
| P5-01 Three.js 视口适配器 | `IN PROGRESS` | `src/facade/threeViewport.ts` 使用 `three@0.185.1`,已挂载 WebGL2 场景和资源释放React 视口通过 Facade OCCT 预览链生成 Pad/Pocket Mesh |
| P3-01 Bitbybit OCCT WASM 运行时 | `IN PROGRESS` | 精确锁定 `@bitbybit-dev/occt-worker@1.1.1`,专用 Worker 可加载 34,524,750 字节 OCCT WASM尚未建立 FreeCAD/OCCT 自构建脚本,不能标记完成 |
| P3-02 几何句柄与网格协议 | `IN PROGRESS` | Facade 已定义并实现受控 `ShapeHandle``MeshAsset``SubshapeRef` 类型;成功 generation 写入对象拓扑快照、迁移 matches 和保守历史;重算自动迁移 LinkSub/外部几何,歧义/删除保持显式状态和诊断;候选替换事务只接受源对象最新同 kind persistentId属性/诊断 UI 可提交并支持 Undo/Redo。OCCT 原生历史、邻接/曲率签名、跨 Boolean 映射和 3D 候选高亮仍未实现 |
| P3-02 几何句柄与网格协议 | `IN PROGRESS` | Facade 已定义并实现受控 `ShapeHandle``MeshAsset``SubshapeRef` 与带对象 ID 的 `ViewportMeshAsset`;成功 generation 写入对象拓扑快照、迁移 matches 和保守历史;重算自动迁移 LinkSub/外部几何,歧义/删除保持显式状态和诊断;候选替换事务只接受源对象最新同 kind persistentId属性/诊断 UI 可提交并支持 Undo/Redo;多对象视口注册及 OCCT `edgeList`/BRepGraph vertex 拾取已由 Chrome 双实体场景证明。插件失败时保留网格回退,但完整 OCCT 操作历史和跨 Boolean 映射仍未实现 |
| P3-03 基本体和变换 | `IN PROGRESS` | 真实 OCCT Box/Cylinder/Sphere/Cone 和浏览器矩阵已验证基础 PlacementFacade 重算 executor 现在对对象 Placement 做严格结构校验,在 Shape 生成后执行平移/轴角旋转,恒等变换跳过额外句柄,失败时释放临时 Shape 并保留最近有效缓存Node/fallback 已覆盖失败释放、畸形输入和保存恢复。0.05 mm 网格精度下曲面包围盒最大离散误差约 0.023 mm自动化浏览器黄金/体积测试尚未进入 CI |
| P3-04 Boolean/Pad/Pocket/Revolution | `IN PROGRESS` | 文档作用域 Union/Cut/Intersection 与 PlanarProfile 驱动的 Pad/Pocket/Revolution 已通过真实 OCCT 浏览器矩阵;重算 executor 已在 Worker ready 时执行 Pad/Pocket/RevolutionRevolution Angle/Reversed 已接入Fillet/Chamfer 也有 Shape 缓存回写Up to face、FCStd Shape 持久化仍待完成 |
| P3-05 Fillet/Chamfer/Mirrored/MultiTransform/Pattern/Hole | `IN PROGRESS` | Fillet/Chamfer 已接入 Shape 缓存Mirrored 使用 OCCT plane-normal mirrorMultiTransform 组合结构化 Linear/Polar/Mirrored 步骤并限制最多 100 实例Linear/Polar Pattern 已贯通 Placement/union基础 Hole 支持 Diameter、Depth、Dimension/Through all。变换类当前操作整 ShapeHole 固定原点法向局部特征历史、Datum/TopoRef 平面、连接单实体过滤及完整孔语义仍待实现 |
@@ -1644,7 +1644,7 @@ P0 基线/治理
| Three 网格消费 | `PASS` | `MeshAsset` 转为 Three `BufferGeometry`,旧 geometry 在替换/销毁时释放;选择变化不再重建场景 |
| 生产构建 | `PASS` | Vite 输出独立 `geometryWorker` 与 OCCT WASMWASM 约 34.5 MBgzip 约 8.6 MB |
限制和下一任务P3-02 还需设计稳定 `SubshapeRef` 的持久命名算法P3-03 需要把已通过的浏览器黄金包围盒矩阵纳入 CI并补充体积核验P5-02 需要按文档对象 ID 建立多对象网格缓存,而不是仅加载一个启动预览实体
限制和下一任务P3-02 还需继续完善边/点级稳定 `SubshapeRef` 的持久命名算法P3-03 需要把已通过的浏览器黄金包围盒矩阵纳入 CI并补充体积核验P5-02 按文档对象 ID 建立多对象视口注册,但仍需做跨重算的 BufferGeometry 增量复用和大场景缓存淘汰
### 16.12 P3-03 基本体与 Placement 验证记录
@@ -1729,7 +1729,7 @@ DocumentSnapshot 现在区分模型树投影与 `DocumentObjectSnapshot` 真值
| OCCT Fillet/Chamfer | `PASS` | Facade 调用 Bitbybit `filletEdges`/`chamferEdges`,半径/距离和边索引在边界校验;真实稳定 TopoRef 选边仍待 TSN |
| STEP/STL 几何导出 | `PASS` | Facade 通过 Bitbybit IO Worker 导出 STEP 和 ASCII STLFCStd 参数化文档读写仍未完成 |
尚未完成的 TSN 工作OCCT `Generated/Modified/Deleted` 历史捕获、跨布尔/特征的真实拓扑映射、面/边/顶点统一命名、附着和 `TopoRef` 文件迁移。当前签名是可审计的基础候选层,不能单独宣称 FreeCAD 稳定拓扑命名已完成
TSN 当前已接入普通单向 Pad/Pocket/Revolution/Groove 的 OCCT `Generated/Modified/Deleted` 历史、邻接指纹消歧、对象级 `FaceN/EdgeN/VertexN` ElementMap 和 FCStd live map 写出;仍未完成的是复合/多阶段跨 Boolean lineage、完整 ElementMap2 历史 token 迁移、所有对称模型的 exact 命名以及完整附着迁移。签名与邻接仍是无法由原生关系证明时的可审计 fallback不能把 fallback 单独宣称 FreeCAD 稳定拓扑命名。
Sketcher 当前边界:领域模型可往返保存点、线、圆、弧、椭圆和 B-spline次数、控制点、权重、节点、周期标志基础适配器只对前四类及 Coincident/Horizontal/Vertical/Distance/Radius/Diameter/Angle/Equal/Symmetric/Tangent/Block 做确定性约束处理,对椭圆/B-spline 返回明确 unsupported 诊断。SK-04 已增加版本化 provider 协议、能力探测、取消/过期结果隔离和回放合同。仓库没有 FreeCAD 源码或 planegcs WASM 产物,因此对应 provider 明确返回 unavailable完整 FreeCAD `planegcs` 数值求解、冗余约束分类、B-spline 求解、外部几何、自动约束和拖拽交互仍需 SK-03、SK-07、SK-09、SK-10 的 WASM/浏览器回放门禁。