Files
Web_FreeCAD_Bitbybit/docs/freecad-full-parity-execution-wbs.zh-CN.md
wangdequan 2be18a511e
Some checks failed
real-verification / chrome (push) Has been cancelled
real-verification / freecad-oracle (push) Has been cancelled
real-verification / wasm (push) Has been cancelled
feat: advance FreeCAD parity verification and runtime boundaries
2026-08-11 02:14:45 -04:00

481 lines
63 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 原生双向 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
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 和 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 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`