63 KiB
FreeCAD 1.1.1 全功能对标执行 WBS
1. 文档职责
本文负责执行组织和任务分配;全功能主任务账本负责范围,执行路线图负责阶段顺序,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 仍等待全部上游产物。
允许的并行工作:
- P01 建立完整 oracle 时,P02 可继续已有原生 Worker 加固,但 G1 必须等待 G0 的比较器和 fixture。
- P03 的 schema/迁移基础与 P02 的浏览器实例化可并行;原生历史覆盖和三方黄金必须等待 P02。
- P04 的 planegcs 构建可在 P03 前启动;外部几何、Support 和完整压力回放必须等待稳定 TopoRef。
- P06 的 ZIP 安全、Document/GuiDocument 映射和未知字段保留可与 P05 并行;可编辑 Shape 和完整 round-trip 必须等待 P05。
- P07 与 P08 在 G4/G5 后并行;BIM 依赖 Draft/Spreadsheet 的共享对象和表达式合同。
- P10 的单测、安全预检和基线持续执行;最终发布任务必须等待 P01-P09 全部阶段门。
禁止的并行捷径:用 UI prototype 替代领域实现、用 Node smoke 替代浏览器证据、用网格索引替代 TopoRef、在 FCStd 未保留未知字段时写回用户文件、在 solver/post/addon 未隔离时启用执行入口。
3.1 连续执行编排与任务交接
以下编排是 P01-P10 的连续执行顺序;任务 ID 与状态仍以 config/freecad-execution-plan.json 为唯一真值。每个切片完成后立即领取同一关键路径上的下一个未完成切片,不等待人工确认。
TSN-03先扩展 native OCCTGenerated/Modified/Deleted合同:从fuse/cut/common扩展到已实现的 Pad、Pocket、Loft、Pipe、Revolution、Groove、Fillet、Chamfer、Draft、Thickness、Pattern、Hole;每个操作必须有 STEP/Worker 请求、源子形状关系、Chrome 回放和释放证据。随后把关系交给稳定 TopoRef 迁移和 Body/Tip 生命周期。- P04 按
SK-06 → SK-07 → SK-11 → SK-09 → SK-10 → SK-12执行:先补 planegcs 几何约束图,再补尺寸/参考诊断和 profile fixture,之后完成交互编辑、B-spline 编辑、500 模型黄金与压力回放。 - P05 按
PART-ALL → PD-BASE → PD-LOFT → PD-DRESSUP → PD-TRANSFORM → PD-CLOSURE执行;每个特征都必须同时覆盖参数编辑、失败保留上一 Shape、TopoRef/Support/Tip、撤销、保存/加载和 Chrome Worker 证据。 - 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 都必须分类记录。 - 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。 - P09 在 P08 收口后按
FEM-ALL、CAM-ALL、ROBOT-ALL、INSP-ALL、DATA-ALL、ADDON-ALL、SCRIPT-ALL、PLATFORM-CLOSURE执行;插件和脚本默认隔离,不能绕过 Facade、OPFS 权限或安全策略。 - 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 模块清册
Owner:ORACLE。Gate:G0。当前 headless oracle 只覆盖 Part/Material/Measure。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| ORA-01 | ORACLE:完整 GUI/工作台 CMake profile、构建清单、依赖和 hash | 锁定提交可干净重建;GUI/工作台可探针 |
| ORA-02 | ORACLE:GUI-aware 探针和 compiled/import/gui-only 状态模型 | 输出确定性 JSON;失败类型不可混淆 |
| INV-01 | ORACLE:34 模块、工作台、命令及源码位置清册 | 无未登记目录或命令 |
| INV-02 | ORACLE:TypeId、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+QUALITY:100 成功、50 失败 fixture | 覆盖单位、拓扑变化、核心对象和错误 |
| BASE-04 | ORACLE+QUALITY:树/属性/Shape/拓扑/诊断比较器 | 未登记差异直接失败 |
P02 原生 OCCT Worker、三方 Boolean 黄金与内存门禁
Owner:KERNEL。Gate:G1。现有原生历史 provider 为可配置、非默认状态。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| BYB-03 | KERNEL:Bitbybit/OCCT 可复现源码构建、补丁、ABI、hash、许可证 | 干净构建导出一致 |
| BYB-05 | KERNEL:能力握手、取消、超时、崩溃、stale-result 协议 | 错误消息安全失败;重启不接受旧结果 |
| BYB-06 | KERNEL:Shape 所有权、引用计数、释放账本和指标 | 无 use-after-release;保留内存受控 |
| BROWSER-OCCT-01 | KERNEL+QUALITY:Chrome 真实 Worker/WASM harness | COOP/COEP、OPFS、加载、取消、崩溃恢复通过 |
| BYB-07 | KERNEL+ORACLE+TOPO:Fuse/Cut/Common 三方报告 | 几何、历史、公差和错误差异均可解释 |
| MEM-OCCT-01 | KERNEL+QUALITY:1000 次 Boolean 压力和堆/WASM/GPU 报告 | 临时 Shape 全部对账;峰值/保留量达预算 |
| BYB-08 | KERNEL+QUALITY:依赖升级 API/ABI/黄金漂移门禁 | 上游变化不能静默进入主线 |
P03 稳定 TopoRef、邻接/曲率签名和变异回放
Owner:TOPO。Gate:G2。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| TSN-03 | TOPO+KERNEL:Boolean/PartDesign Generated/Modified/Deleted | 每个源子形状关系可解释 |
| TSN-04 | TOPO:解析曲线/曲面参数、方向、容差和曲率签名 | 不依赖三角网格精度和瞬时索引 |
| TSN-05 | TOPO:邻接图、一对一/一对多评分和置信度 | 刚体变换和参数修改保持安全引用 |
| TSN-06 | TOPO:对称、重复、分裂、合并歧义策略 | 低置信度不强绑 |
| TSN-07 | TOPO+CORE:多输入 Boolean、Pattern、跨 Body lineage | 结果可追溯到源对象和实例 |
| TSN-08 | TOPO+IO:LinkSub、外部几何、数据库、FCStd 迁移 | stable/ambiguous/deleted 可跨版本往返 |
| TSN-09 | TOPO+CORE:3D pick/preselect/highlight/candidate repair Facade | UI 不保存网格索引 |
| TSN-10 | TOPO+QUALITY:100 模型、1000 参数变异和随机回放 | 无静默错绑;歧义全部可诊断 |
P04 planegcs WASM 与完整 Sketcher
Owner:SKETCH。Gate:G3。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| SK-03 | SKETCH+KERNEL:最小 planegcs 源图、Emscripten 构建和 hash | 独立 Worker 确定性求解 |
| SK-04 | SKETCH:provider 能力、诊断、取消、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 | SKETCH:trim/extend/split/drag/autoconstraint 和回放 | Task、键鼠和编辑行为与 oracle 对齐 |
| SK-10 | SKETCH:B-spline poles/knots/weights/degree/periodic | 编辑和约束 round-trip 通过 |
| SK-11 | SKETCH+CORE:开放/闭合/多环/自交 profile 分类 | PartDesign 获得兼容错误 |
| SK-12 | SKETCH+QUALITY:500 模型确定性与性能套件 | 成功、冲突、冗余、拖拽均达预算 |
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 参数化闭环
Owner:CORE。Gate:G4。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| CORE-09 | CORE:Body、Origin、Feature 顺序、Tip 重定向和单实体 | 抑制/删除/重排与 FreeCAD 一致 |
| CORE-10 | CORE+TOPO:Support、MapMode 和 Attachment engine | 面/平面支撑可跨拓扑变化 |
| CORE-11 | CORE:AttachmentOffset、Placement 组合和局部坐标链 | 结果位置在声明公差内一致 |
| PART-ALL | CORE+KERNEL:Part 基本体、Boolean、Builder、修改、检查和格式 | 全 Part 命令及交换格式黄金通过 |
| PD-BASE | CORE+SKETCH:Pad/Pocket/Revolution/Groove 全模式 | 参数编辑使用原生历史重算 |
| PD-LOFT | CORE:Additive/Subtractive Loft/Pipe | 失败保留最近有效 Shape |
| PD-DRESSUP | CORE+TOPO:Fillet/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/5;Chrome 150/WASM 得到相同体积(误差不超过 1e-7)并释放到 0/0。Facade 覆盖 To-face 稳定 TopoRef、双向与两角度模式、失败保留上一 Shape;Chrome 参数编辑 42→31、重算、Undo 31→42、保存/加载通过,Pad/Pocket/Revolution/Groove 原生 OCCT history 分别记录 25/42/23/2 条关系。
PD-LOFT 收口证据:Chrome 150 通过 Facade 顺序创建 AdditiveLoft、AdditivePipe、SubtractiveLoft、SubtractivePipe,四个结果均为正体积有效 Shape,Transformed transition、section/path 链、Body.Tip、OPFS 保存/加载和 0/0 释放通过。重复 section 与分叉 path 分别返回稳定诊断,Loft/Pipe 失败期间 Shape ID 不变且修复后恢复;FreeCAD 1.1.1 原生四对象 oracle 4/4,Loft/Pipe 原生 OCCT history 为 24/28 条。
PD-DRESSUP 收口证据:Chrome 150 Facade 生命周期在 Hole 基体上顺序创建 Fillet、Chamfer、Draft、Thickness,随后继续 Mirrored、LinearPattern、PolarPattern、MultiTransform 与 Hole;10 个结果均为正体积,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
Owner:IO。Gate:G5。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| FC-04 | IO:Document/GuiDocument 对象、Property、Extension、视图映射 | 已知元数据双向无语义丢失 |
| FC-05 | IO+KERNEL:BRep/Shape/缩略图资源解析和写出 | 拓扑、质量属性、颜色、精度对齐 |
| FC-06 | IO+TOPO+SKETCH:Expression/Unit/Link/TopoRef/Sketch codec | FreeCAD 可重算支持对象 |
| FC-07 | IO+QUALITY:未知 XML/对象/资源透明保留和脚本隔离 | proxy 字节在读写后不变 |
| FC-08 | IO+KERNEL:STEP/IGES/BREP 完整适配 | 100 模型单位/颜色/公差黄金通过 |
| FC-09 | IO+相关 workbench:Mesh/2D/BIM/数据格式 | 每格式有成功、失败和 round-trip |
| FC-10 | IO+ORACLE:FreeCAD→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
Owner:DOC。Gate:G6。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| TD-ALL | DOC+TOPO:Page/View/Section/Dimension/GD&T/Annotation、SVG/PDF | 投影、比例、TopoRef 更新通过 |
| SS-ALL | DOC+CORE:Cell/Formula/Alias/Style/Merge/Binding/CSV | DAG 循环和对象绑定与 FreeCAD 一致 |
| DRAFT-BASE | DOC+SKETCH:Working Plane/Snap/Grid 和参数化二维对象 | 创建编辑 fixture 通过 |
| DRAFT-OPS | DOC+CORE:变换、Offset、Trim、Array、Clone、Layer | 保存后仍参数化 |
| PLOT-ALL | DOC:Series/Axis/Legend/Style/Binding、图片/SVG/CSV | 绑定数据确定性更新 |
| DOC-CLOSURE | DOC+IO+QUALITY:四工作台混合文档 | 创建、编辑、保存、加载、导出全通过 |
P08 Assembly、BIM、Mesh、Surface
Owner:ENGINEERING。Gate:G7。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| ASM-CORE | ENGINEERING:Component/Link/LCS/Joint、solver Worker | 固定/距离/角度/运动 fixture 通过 |
| ASM-TOOLS | ENGINEERING:碰撞、爆炸、BOM、变体 | 大装配和 FCStd 门禁通过 |
| BIM-CORE | ENGINEERING+DOC:空间层级、建筑元素、材料、属性集、清单 | 参数编辑和数量表通过 |
| BIM-IFC | ENGINEERING+IO:IFC2x3/IFC4、分类和 proxy | 几何、层级、Property 往返 |
| MESH-CORE | ENGINEERING+KERNEL:导入、转换、分析、修复、Worker/LOD | 非流形、自交、孔和大网格通过 |
| SURF-CORE | ENGINEERING+TOPO:BSpline/Bezier/Fill/Offset/Trim/Join | 连续性、容差和 TopoRef 通过 |
| ENG-CLOSURE | ENGINEERING+QUALITY:大型混合工程项目 | 跨工作台保存加载和性能达预算 |
P09 分析、制造、数据、插件和脚本
Owner:PLATFORM。Gate:G8。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| FEM-ALL | PLATFORM:Analysis/Material/Sets/Loads/Mesh/Solver/Results | 本地或远端策略明确;参考求解通过 |
| CAM-ALL | PLATFORM:Job/Stock/Tools/Operations/Simulation/Post | 碰撞、仿真和 G-code 黄金通过 |
| ROBOT-ALL | PLATFORM:Robot/Axes/Pose/Trajectory/Kinematics/Collision | 运动和工作空间 fixture 通过 |
| INSP-ALL | PLATFORM+TOPO:测量、剖切、偏差、检查和报告 | 单位、精度、TopoRef 和导出通过 |
| DATA-ALL | PLATFORM+IO:Points/RE/OpenSCAD/IDF/JT/Material/Import | 每模块有适配器或显式 proxy |
| ADDON-ALL | PLATFORM+QUALITY:签名目录、安装/更新/删除、权限、隔离、回滚 | 不可信插件不能越过 Facade/权限 |
| SCRIPT-ALL | PLATFORM+QUALITY:API 映射、受限解释器、宏回放 | 文件/网络/时间/资源权限强制执行 |
| PLATFORM-CLOSURE | PLATFORM+ORACLE:34 模块最终覆盖报告 | 无 scope-only 或未解释 unsupported |
P10 QA、浏览器、性能、安全、迁移与发布
Owner:QUALITY。Gate:G9。P10 从第一天持续执行,最终关闭依赖 P01-P09。
| 任务 | 分配与交付 | 验收重点 |
|---|---|---|
| QA-01/02 | QUALITY+ORACLE:单元/属性覆盖、CLI/GUI 每命令成功失败 fixture | 核心不变量和兼容声明有证据 |
| QA-03 | QUALITY:Chrome E2E 与视觉矩阵 | 核心桌面/移动工作流无阻断差异 |
| QA-04 | QUALITY+TOPO+SKETCH:几何/solver/parser seeded fuzz | 无崩溃、静默损坏和错绑 |
| QA-05 | QUALITY:1000 对象、百万三角形、大装配、大表和长会话 | P95、峰值和保留内存达预算 |
| QA-06 | QUALITY+IO+KERNEL:Worker/WASM/OPFS 崩溃、配额、断电、stale | 恢复确定,数据损失明确报告 |
| QA-07 | QUALITY+PLATFORM:文件、消息、脚本、Addon、CSP 和权限安全 | 无未处置 critical |
| QA-08 | QUALITY+DOC:键盘、读屏、locale、长文本和移动 | 核心流程达到目标 a11y 标准 |
| REL-01 | QUALITY:PWA、离线、cache、COOP/COEP、CSP runbook | 首装、升级、离线、缓存恢复通过 |
| REL-02 | QUALITY+IO:版本迁移、回滚或无损导出演练 | 每个支持版本有恢复路径 |
| REL-03 | QUALITY:SBOM、许可证、漏洞和签名产物 | 无未知二进制或未处置 critical |
| REL-04 | QUALITY+全体 owner:最终能力/差异矩阵和发布 runbook | G0-G9 通过,无未解释 unsupported |
5. 任务状态与交接合同
状态只允许 pending、in_progress、completed、blocked。completed 必须同时满足:代码/文档已落地、配置中的 deliverables 全存在、acceptance 全有自动证据、兼容矩阵已更新、下游 owner 已完成接口验收。
每次跨 lane 交接必须包含:
- 版本化 Facade/Worker/schema 合同。
- 能力探测和 unsupported 原因。
- 成功、失败、取消、超时、stale 和资源释放测试。
- FreeCAD oracle fixture 与差异报告。
- 持久化/迁移影响和安全说明。
- 下游不得依赖的内部句柄、瞬时索引或实现细节。
阻塞条件必须记录具体缺失依赖、复现命令和解除条件;“任务很大”或“以后支持”不是有效阻塞原因。
6. 统一门禁
日常增量:
./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/CSV;Chrome 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/*(含 WASM)precache,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 重开后分别生成不同 ShapeHandle,Pad 体积为 504→372→504→504,各阶段 Body.Tip=pad、Sketch.Support=XY_Plane、solid=1;Loft/Pipe 与 dress-up 的三类失败均保留上一有效 Shape 并在修复后生成新 Shape。基础模式、四类 Loft/Pipe、14 步 dress-up/transform/Hole 创建链、三套保存加载、15 类原生历史及全部资源归零同时通过。
15. P09 平台工作台闭包证据
FEM 以本地轴向参考求解策略覆盖材料、节点集、约束、载荷、位移/应力结果场;CAM 覆盖 Job/Stock/Tool/Operation、碰撞负例、仿真、GRBL/LinuxCNC 白名单后处理和确定性 G-code;Robot 覆盖三轴正运动学、工作空间、轨迹、碰撞及控制器导出;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 MB;QA-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 precache;REL-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 或浏览器时追加:
./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-FIT(2026-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资源释放;拟合结果为平面 RMS1.73e-16、球半径2、圆柱半径3/高度8、多项式 RMS0,区域分割为两个各 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 View(Model/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 个结果、Preferences3 select + 2 checkbox、模型树 4 项上下文命令、Part Design 5 个工具栏组;桌面1440x1000无横向溢出,OCCT canvas892x679、27 色、WebGL error 0,390px 启动页无溢出,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 oracle;UI-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 种 Stock;SetupSheet 提供快速进给、安全/间隙高度、深度表达式和 coolant;ToolBit 覆盖 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/Redo;FreeCAD 原生 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。执行关键路径为:
EX-ORA-01 -> EX-ORA-02 -> EX-KER-01,先扩展原生证据,禁止用 Web 当前行为自证。EX-TSN-00 -> EX-TSN-01 -> EX-TSN-02/03 -> EX-TSN-04,闭合逐阶段历史、私有 token 证据和同构来源。EX-DOC-01..05 -> EX-SK/PART/PD -> EX-FC/FMT,完成对象、特征和文件语义。EX-UI-01..05与 EX07..EX09 按依赖推进,逐工作台比较成功、失败、取消、保存重开和资源释放。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。