# 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 模块清册

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 原生双向 23 场景没有未知差异，未知 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 交接必须包含：

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/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 和 23 个 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 或浏览器时追加：

```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-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` 资源释放；拟合结果为平面 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 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 个结果、Preferences `3 select + 2 checkbox`、模型树 4 项上下文命令、Part Design 5 个工具栏组；桌面 `1440x1000` 无横向溢出，OCCT canvas `892x679`、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`。执行关键路径为：

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`。
