Files
Web_FreeCAD_Bitbybit/docs/freecad-web-execution-master-plan.zh-CN.md
wangdequan d11566403d
Some checks are pending
real-verification / chrome (push) Waiting to run
real-verification / freecad-oracle (push) Waiting to run
real-verification / wasm (push) Waiting to run
feat: close ordered pairs and property codec batches
2026-08-17 04:58:46 -04:00

413 lines
28 KiB
Markdown
Raw Permalink 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 Web 转换执行总计划
更新时间2026-08-15
## 1. 目标、口径与真值
项目唯一目标是把锁定的 FreeCAD `1.1.1` 能力迁移到浏览器,并保留 FreeCAD 的文档、属性、重算、拓扑命名、文件和交互语义。项目不是远程桌面、截图流,也不是只复刻界面的通用 Web CAD。
进度必须同时区分两种口径:
1. 兼容实现口径:`config/freecad-execution-plan.json` 的 P01-P10 共 83 项均已完成,证明当前 Web 应用有可运行实现、门禁和明确能力边界。
2. exact 对标口径:`config/freecad-web-exact-parity-plan.json` 共 52 项,当前为 5 completed、36 in_progress、11 pending34 个模块为 0 exact、26 compatible、5 proxy、3 development。
因此当前结论是“可运行的 FreeCAD 风格 Web CAD 兼容基线已形成”不是“FreeCAD 已完整 Web 化”。只有 `EX-REL-01` 关闭、52/52 exact 任务完成、34/34 模块为 exact 且未知差异为零,才能改变系统级 exact claim。
发生状态冲突时按以下顺序取真值:
1. `config/freecad-web-exact-parity-plan.json`exact 任务、依赖、阻断项。
2. `config/release-capability-matrix.json`34 模块可对外声明的等级。
3. `config/freecad-active-work-queue.json`:当前唯一在执行的微任务。
4. `config/freecad-execution-plan.json`:兼容实现 P01-P10 的完成情况。
5. `config/*-verification.json`、原生报告和 Chrome 报告:某个环境中的实际证据。
6. 本文与 `docs/current-work.zh-CN.md`:解释、顺序和交接入口。
## 2. 当前完成情况重审
### 2.1 已形成闭环的兼容基线
- React/Vite FreeCAD 风格应用壳、菜单、工作台、Combo View、Task、视口、Report/Jobs/Diagnostics 和状态栏可以运行。
- React 只通过 `BitBybitWebCadFacade` 进入 CAD 领域Three.js、OCCT、SQLite/OPFS 和 Worker 没有成为 UI 业务旁路。
- Bitbybit OCCT Worker、原生 history provider、FreeCAD 私有命名 ABI、planegcs WASM 和 SQLite OPFS 均已有构建或运行门禁。
- Part、PartDesign、Sketcher、FCStd 和 26 个 compatible 模块已有代表性实现与 Chrome 证据。
- CAM 已有 CAD -> OpenCAMLib -> CAMotics -> G-code -> LinuxCNC WASM 的真实浏览器验证链。
- P01-P10 的 83/83 项兼容任务已完成,发布门 G0-G9 在该口径下通过。
### 2.2 已完成的 exact 独立切片
- `EX-TSN-00`:缺失原生命名或 builder 证据时 fail-closed。
- `EX-TSN-01`:已支持 builder 的逐阶段 Shape 与 Generated/Modified/Deleted 证据。
- `EX-TSN-02`:生产 FreeCAD 私有 MappedNameRef/StringHasher 命名来源。
- `EX-TSN-03`:同构拓扑只从唯一原生 provenance 稳定化,多来源保持 ambiguous。
- `EX-PD-02`Attachment、Datum、ShapeBinder/SubShapeBinder、多 Body 与 XLink 重连生命周期的独立验收范围。
这些任务按自身验收范围关闭,不表示它们依赖的整个 PartDesign、文档或内核任务已经 exact。
### 2.3 已量化但尚未关闭的 P0 阻断
- Oracle352 个注册对象、348 个可实例化对象、4 个不可实例化对象、1111 个启动 GUI command、19 个 source-only command 和 2 个 context-only command 已分类;命令族的成功、禁用、失败、取消、恢复流程仍未穷尽。
- Property85 种运行时类型、5510 条记录中30 种/4361 条为通用原生 codec5 种/683 条为专用 codec50 种/466 条仍为 opaque proxy。
- Property status15 类已观察状态均已进入类型化 Facade 行为;`LockDynamic``PartialTrigger` 已有原生事务证据,但完整 observer 与局部重算序列未关闭。
- TSN30/30 原生 mutation、219/219 几何阶段恢复通过11 个 PartDesign case/28 个恢复命名阶段均已通过第二次独立原生复跑分类为允许演进。
- 生产命名链:五阶段 5/5 几何恢复2 个恢复拓扑 case/5 个下游阶段已分类为允许演进;仍有 3/5 通用 Shape 代理并缺注册 rotate mutation family。
- 有序操作19×19 的逐对分类持续执行;实时已完成数、未知数和唯一活动项只从生成状态读取。
- FCStd支持的原生 codec 与未知资源保留已有证据,但所有对象/属性/Extension/Shape/ElementMap2/StringHasher 的 FreeCAD-Web-FreeCAD 双向变异未穷尽。
- GUI应用壳和代表性工作流已有浏览器证据但动态命令、Task、对话框、焦点、上下文和逐工作台流程没有完整原生对照。
- 发布:系统级 exact 为 false`EX-REL-01` 为 pending跨浏览器、长期运行和全模块 exact promotion 尚未开始。
### 2.4 可机器核对的完成度仪表盘
实时仪表盘为 `docs/freecad-active-work-status.generated.zh-CN.md`,由 `generate:freecad-active-work-queue` 同活动队列一起生成,并由 `check:freecad-active-work-queue` 逐字校验。此处不再复制任务数、完成数、操作对覆盖数、Property 覆盖数或下一任务;任何手工状态摘要均不具备治理效力。
## 3. 目标架构和不可破坏边界
```text
React / FreeCAD Web UI
|
BitBybitWebCadFacade + Command/Task contracts
|
Document + Property + Transaction + DAG/Recompute
|
Geometry / Sketch / Naming / Project / CAM facades
|
Dedicated Workers
|
Bitbybit OCCT + FreeCAD naming + planegcs + SQLite OPFS
|
FCStd / STEP / IGES / mesh / CAM / engineering resources
```
任何后续任务都必须满足以下边界:
- UI 不直接调用 Three.js、OCCT、OPFS、SQLite 或脚本执行器。
- 最终 Shape 相似不能替代逐阶段 history、命名、文档状态和 FCStd 证据。
- mock 和 Node 单测不能替代真实 Chrome Worker/WASM 回放。
- 未知属性和资源必须无损保留或拒绝编辑,不能猜测性改写。
- 原生来源不唯一时保持 ambiguous不能按数组顺序或网格索引稳定化。
- FreeCAD 本身拒绝的组合保存原生失败 oracle不强行实现为成功链。
- 每次只允许一个机器队列任务为 `in_progress`,避免同时扩展多个工作台。
## 4. 最小任务和完成定义
一个“最小实现任务”只处理一个命令、属性类型、特征参数分支、原生 case 或有序操作对。每项按以下九个独立检查点推进:
1. `A-inventory`锁定源码位置、TypeId/command id、依赖和适用对象。
2. `B-native-success`:采集 FreeCAD 1.1.1 成功结果、状态、事件和资源。
3. `C-native-negative`:分别采集 disabled、failure、cancel不适用时保存可验证原因。
4. `D-native-mutation`:编辑输入、重算、恢复,并记录逐阶段 Shape/history/naming。
5. `E-facade`:在 Facade/Worker 边界内实现结构化合同和失败诊断。
6. `F-transaction`:覆盖 Undo/Redo、abort、stale generation 和最后有效状态保留。
7. `G-roundtrip`FreeCAD 保存 -> Web 读取/修改/保存 -> FreeCAD 重开/再保存。
8. `H-browser`:真实 Chrome Worker/WASM/OPFS 回放,结束后 Shape/Worker/资源归零。
9. `I-promotion`:聚焦 check、计划 blocker、能力矩阵和差异账本同步。
只有 A-I 全部完成,最小能力才能提升 exact。若任务仅为 oracle 准备,则只关闭它明确声明的证据范围,不提前关闭实现任务。
## 5. 当前串行微任务队列
当前机器队列由 `scripts/generate-freecad-active-work-queue.mjs` 生成。每个条目只允许一个产物、一个聚焦检查和一个退出条件。
### 5.1 ORA GUI 基线106 项,已完成
- `ORA-GUI-SETUP-000..002`:拆分 GUI 探针、诊断 BIM 首启弹窗、隔离用户配置。
- `ORA-GUI-SHARD-000..099`100 个连续分片,覆盖 1111 个命令的 no-document/document/selection 三态。
- `ORA-GUI-MERGE-000`:合并分片并校验 ID 全集、连续区间和 SHA-256。
- `ORA-GUI-CONTEXT-000..001`:分类 `Import_ReadBREP``NaviCubeDraggableCmd` 的延迟注册边界。
### 5.2 ORA GUI 工作流7 项,已完成
- `ORA-GUI-WF-000`:选择首个命令族。已选 `PartDesign_Pad`,映射主任务 `EX-UI-03`,关联 `EX-ORA-01/EX-PD-01`
- `ORA-GUI-WF-001`Pad 原生成功工作流和聚焦断言已完成Task 打开/接受、Body Tip、体积、拓扑和 Undo 证据通过。
- `ORA-GUI-WF-002`:无活动文档时的 disabled 工作流已完成QAction 与命令管理器入口均被阻止文档、Task 和事务保持为空。
- `ORA-GUI-WF-003`open-wire profile 的 failure 工作流已完成原生诊断、Task 可修正状态和失败清理回滚均已锁定。
- `ORA-GUI-WF-004`:有效预览后的 Cancel 工作流已完成;回滚、活动 Body 及原生选择/焦点轨迹均已锁定。
- `ORA-GUI-WF-005`:失败后在同一 Task 内修复 profile、提交、Undo/Redo、保存重开和二次保存已完成。
- `ORA-GUI-WF-006`exact blocker、聚焦门禁和后继 TSN 队列已更新,已完成。
### 5.3 TSN 恢复漂移13 项,已完成
按以下顺序一次解释一个 case
| 队列 ID | case | 唯一 mutation 轨迹 | 漂移 ordinal | 阶段数 | 状态 |
| --- | --- | --- | --- | ---: | --- |
| `TSN-DRIFT-000` | `partdesign-plain` | `Pad10.Length: 7 -> 7.75 -> 7` | `0,9` | 2 | completed / allowed_evolution |
| `TSN-DRIFT-001` | `partdesign-midplane` | `Pad11.Length: 8 -> 8.75 -> 8` | `0,9` | 2 | completed / allowed_evolution |
| `TSN-DRIFT-002` | `partdesign-reverse` | `Pad12.Length: 5 -> 5.75 -> 5` | `0,9` | 2 | completed / allowed_evolution |
| `TSN-DRIFT-003` | `partdesign-taper` | `Pad13.Length: 6 -> 6.75 -> 6` | `0,9` | 2 | completed / allowed_evolution |
| `TSN-DRIFT-004` | `partdesign-twoside` | `Pad14.Length: 7 -> 7.75 -> 7` | `0,9` | 2 | completed / allowed_evolution |
| `TSN-DRIFT-005` | `partdesign-pocket` | `Pad15.Length: 8 -> 8.75 -> 8` | `0,9,11` | 3 | completed / allowed_evolution |
| `TSN-DRIFT-006` | `partdesign-pocket-through` | `Pad16.Length: 5 -> 5.75 -> 5` | `0,9,11` | 3 | completed / allowed_evolution |
| `TSN-DRIFT-007` | `partdesign-pocket-midplane` | `Pad17.Length: 6 -> 6.75 -> 6` | `0,9,11` | 3 | completed / allowed_evolution |
| `TSN-DRIFT-008` | `partdesign-pocket-twoside` | `Pad18.Length: 7 -> 7.75 -> 7` | `0,9,11` | 3 | completed / allowed_evolution |
| `TSN-DRIFT-009` | `partdesign-pocket-taper` | `Pad19.Length: 8 -> 8.75 -> 8` | `0,9,11` | 3 | completed / allowed_evolution |
| `TSN-DRIFT-010` | `partdesign-pocket-up-to-face` | `Pad20.Length: 5 -> 5.75 -> 5` | `0,9,11` | 3 | completed / allowed_evolution |
| `TSN-PROD-DRIFT-000` | 生产 `cut` | 五阶段链 cut 参数编辑/恢复 | 由生产报告锁定 | - | completed / allowed_evolution |
| `TSN-PROD-DRIFT-001` | 生产 `rotate` | 五阶段链 rotate 参数编辑/恢复 | 由生产报告锁定 | - | completed / allowed_evolution |
每项必须得到且只能得到一种结论FreeCAD 稳定语义、允许的命名演进、实现缺陷。实现缺陷必须增加回归测试;未知不能作为结论。
每个 case 再拆成六个必须依次完成的最小检查点;后续能力的 A-I 检查点已经全部进入生成队列:
| 检查点 | 唯一产物 | fail-closed 验收 |
| --- | --- | --- |
| `-A-contract` | case id、target object/type、property path/type、before/edited/restored、drift ordinal | 与锁定 30-case oracle 一致,属性确实可编辑 |
| `-B-replay` | 第二个独立 FreeCAD 1.1.1 进程报告 | 版本、commit、harness SHA-256 和运行状态锁定 |
| `-C-fingerprint` | 每个漂移阶段的 geometry/relation/semantic-name 三相摘要 | 参考与复跑的 before/edited/restored 逐字段一致 |
| `-D-restore` | property 恢复、geometry 恢复、restored-to-nominal 结论 | 任一阶段几何未恢复即停止并调查缺陷 |
| `-E-persistence` | initial/reopened/resaved 命名摘要 | roundtrip/resave drift 为 0且三态与 restored 一致 |
| `-F-decision` | stable_semantics / allowed_evolution / implementation_defect 唯一分类 | 决策进入连续前缀账本checker 通过,只推进直接后继 |
任一检查点失败时,当前任务保持 `in_progress`,不得领取下一 case。如果分类为 `implementation_defect`,还必须在同一队列项内完成最小修复、回归测试、原生/Web 对照和资源释放,不另行跳过。
### 5.4 TSN 有序操作对
操作全集为 Fuse、Cut、Common、Rotate、Pad、Pocket、Loft、Pipe、Revolution、Groove、Fillet、Chamfer、Hole、Draft、Thickness、LinearPattern、PolarPattern、Mirrored、MultiTransform。
每个 `from -> to` 是一个独立任务:
1. 确定 `from` 输出类型与 `to` 输入前置。
2. 在原生 FreeCAD 执行并记录接受或拒绝。
3. 接受时使用真实 builder采集 history/naming。
4. 编辑 `from` 参数并重算 `to`
5. 恢复参数并分类命名/拓扑变化。
6. 保存、重开、再保存并比较。
7. 在生产 Worker 回放并检查释放。
8. 拒绝时固定原生错误类型和文档未污染证据。
初始五阶段转换和 `fuse->*` 连续前缀均已进入机器分类账本;实时覆盖集合与当前操作对严格从生成状态和 `config/freecad-ordered-operation-pair-classification.json` 读取,其余逐对领取。
## 6. 后续关键路径微里程碑
### M00 当前工作树收口
状态completed聚焦门禁、完整 `verify`、发布产物验签、JSON 和 diff 校验均通过。
- M00.1 TSN 原生报告、resave 和 stage correlation 对账。
- M00.2 Property codec/status、Facade 行为和 FCStd 证据对账。
- M00.3 CAM/LinuxCNC artifact hash、浏览器报告和 parser authority 对账。
- M00.4 GUI 分片、source/context-only 分类和 oracle coverage 对账。
- M00.5 `git diff --check`、全部 JSON 解析、完整 `verify`
退出条件:所有生成文件未陈旧,全部门禁通过,没有以报告改写替代真实执行。
### M01 `EX-ORA-01` GUI 工作流闭合
状态:首个 Pad 命令族 7/7 已完成;`EX-ORA-01` 因其他命令族和运行时对象/Property 未穷尽而继续 `in_progress`
先完成 Pad 七步,再按风险选择下一族。每个后续命令族仍拆成 success/disabled/failure/cancel/recovery/update 六个状态任务。选择顺序:核心文档命令 -> Sketcher 创建/编辑 -> PartDesign 参数 Task -> Part builder -> FCStd import/export -> 其他工作台。
退出条件:每个运行时命令归入一个工作流族;每族五态都有原生证据或机器可读不适用原因;未知 GUI 状态为零。
### M02 `EX-TSN-04A` 恢复漂移闭合
状态13/13 已完成11 个 PartDesign case/28 个阶段及 2 个生产 case/5 个阶段均完成独立复跑分类。
- M02.1-M02.1111 个 PartDesign case/28 个命名摘要演进已全部分类为允许演进。
- M02.12:生产 Cut 恢复拓扑漂移已分类为允许演进。
- M02.13:生产 Rotate 恢复拓扑漂移已分类为允许演进。
- M02.14:若发现实现缺陷,只修改一个 operation/case 并补回归。
- M02.15:汇总 zero-unknown drift gate不直接提升系统 exact。
退出条件13/13 case 有分类,未知为零,缺陷修复均有原生与浏览器证据。
### M03 `EX-TSN-04B` builder 与 19×19 转换矩阵
状态:`in_progress`;实时覆盖数和当前操作对见生成状态。
- M03.1:用真实 builder 替换五阶段链中 Cut 之后的通用 Shape 代理,一次替换一个 stage。
- M03.2:增加 Rotate 原生 mutation family。
- M03.3:按 361 个独立任务完成有序组合分类。
- M03.4:每个允许组合完成 mutation、restore、naming、resave、浏览器释放。
- M03.5:每个拒绝组合固定错误和无文档污染证据。
退出条件361/361 分类;所有原生允许组合为真实 builder所有拒绝组合可稳定复现0 generic Shape proxy、0 未解释恢复漂移。
### M04 `EX-DOC-01` Property codec 批次
状态:等待 M01可在不改变单任务并行上限的前提下准备只读 oracle。
每个类型严格执行第 4 节 A-I。批次内一次只领取一个 Property 类型,按复用度和安全风险排序:
- M04.A 量纲标量Acceleration、Area、Force、HeatFlux、Moment、Power、Pressure、Speed、Stiffness、StiffnessDensity、Temperature、ThermalTransferCoefficient、VectorDistance、Quantity。
- M04.B 数学与集合BoolList、Color、ColorList、Direction、Font、IntegerSet、Map、Matrix、PlacementList、Position、Rotation、UUID、VectorList。
- M04.C 链接族LinkListHidden、LinkSubHidden、LinkSubListGlobal、XLink、XLinkList、XLinkSub、XLinkSubList。
- M04.D MaterialApp PropertyMaterial/PropertyMaterialList 与 Materials::PropertyMaterial先固定 schema、继承和资源边界。
- M04.E 文件资源PropertyFile、PropertyFileIncluded、PropertyPath禁止把宿主绝对路径写入浏览器项目。
- M04.F PythonObject先定义禁止执行、可信序列化、代理编辑和迁移边界再决定 codec不得反序列化执行任意 Python。
- M04.G 几何/求解内核Part ShapeHistory/TopoShapeList/FilletEdgesMesh MeshKernel/CurvatureListFem FemMesh/PostDataObjectPoints PointKernelRobot Trajectory。
- M04.H 工作台专用Spreadsheet Sheet/RowHeights/ColumnWidthsTechDraw CenterLine/CosmeticEdge/CosmeticVertex/GeomFormat listsInspection DistanceList。
每个类型的退出条件:原生默认/非默认/边界值、所有观察 status、Data/View editor、动态增删、Undo/Redo、FCStd reopen/resave、Chrome 回放和资源释放全部通过。只有运行时报告变为 native codec 后opaque 计数才允许下降。
### M05 `EX-DOC-02/03` 文档语义
状态:等待 M03+M04。
- M05.1 对象 add/remove/rename 的 observer 前后事件顺序。
- M05.2 Property add/remove/rename/change 的事务顺序。
- M05.3 nested transaction、commit、abort、undo、redo。
- M05.4 DAG 脏标记、局部重算和跨分支顺序。
- M05.5 recompute 失败时保留最后有效 Shape 与诊断树。
- M05.6 partial document load、PartialTrigger、完整加载后重算。
- M05.7 copy/clone/delete/relink/group/extension 生命周期。
- M05.8 Extension 动态属性、版本迁移和未知 Extension 保留。
- M05.9 FeaturePython 默认禁执行、代理、签名能力和显式授权边界。
- M05.10 外链关闭、缺失、重开、路径恢复与多文档事务。
退出条件:原生和 Web 事件序列一致;失败不污染有效状态;重开后 DAG/链接/事务语义稳定;资源归零。
### M06 `EX-KER-01/ORA-02` 内核纵向切片
状态M02 证据已可消费,等待 M05 文档闭环。
按一个 builder/参数分支执行 A-IBox、Cylinder、Cone、Sphere、Torus、Prism、Wedge、Helix、EllipsoidExtrusion、Revolution、Loft、SweepFuse、Cut、CommonFillet、Chamfer随后是 tolerance、healing、validation 和失败诊断。
退出条件参数、单位、placement、公差、有效性、质量属性、逐阶段 history、错误和 Worker 所有权均与原生 fixture 一致。
### M07 `EX-SK-01/02` Sketcher 纵向切片
状态:等待 KER/DOC 前置。
- M07.1 直线/圆/圆弧/椭圆/椭圆弧/双曲线/抛物线/B-spline 的创建与编辑。
- M07.2 几何约束每个 overload 的成功、冗余、冲突和退化。
- M07.3 尺寸、参考、Driving/Driven、单位和表达式。
- M07.4 外部几何 Projection/Intersection/Both 与 TopoRef 漂移。
- M07.5 InternalAlignment、SnellsLaw、B-spline Weight 辅助几何。
- M07.6 autoconstraint、trim/extend/split、construction、virtual space。
- M07.7 任务焦点、选择、键盘、cancel 和 solver stale/crash 恢复。
退出条件:每个 geometry/constraint overload 经过 A-I求解分类、自由度和诊断与原生一致。
### M08 `EX-PART-01` Part 纵向切片
状态:等待 M03+M06。
每个 primitive 和 builder 单独闭环;随后逐项完成 Boolean 参数、Refine、placement、multi-solid、healing、inspection、失败与恢复。不能用一个成功 Box 或最终体积代表整个 Part 工作台。
退出条件:所有注册 Part command/TypeId/参数分支均有原生与浏览器证据,未知选项为零。
### M09 `EX-PD-01` PartDesign 纵向切片
状态:等待 M03+M08。
顺序为 Pad -> Pocket -> Revolution -> Groove -> Additive/Subtractive Loft -> Additive/Subtractive Pipe -> Fillet -> Chamfer -> Hole -> Draft -> Thickness -> Linear/Polar Pattern -> Mirrored -> MultiTransform。每个特征再按模式拆分例如 Length/ThroughAll/UpToFace、Midplane/Reverse/TwoLengths/Taper、成功/无效 profile/失效 support/取消/恢复。
退出条件:每个模式完成 A-IBody Group/Tip、Support/Attachment、跨特征命名和 FCStd 保持一致。
### M10 `EX-FC-01/FMT-01` FCStd 与核心格式
状态:等待 M03+DOC-04。
- M10.1 每种已支持对象/Property 的 FreeCAD -> Web 无修改往返。
- M10.2 Web 修改 -> FreeCAD 重开 -> FreeCAD 再保存 -> Web 重开。
- M10.3 Shape、ElementMap2、StringHasher、Expression、GuiDocument 资源逐项变异。
- M10.4 未知 XML、BRep、脚本和 Extension 的字节保留或只读拒绝。
- M10.5 损坏 ZIP、路径穿越、压缩炸弹、超限和取消。
- M10.6 STEP/IGES/BREP 的单位、颜色、层、名称、装配关系和高级元数据。
退出条件:两次保存重开后未知语义漂移为零;不支持资源有明确只读/代理策略。
### M11 `EX-UI-01..05` GUI 全量对标
状态:先执行 M01完整阶段等待文档与核心特征稳定。
按应用壳、菜单、工具栏、工作台切换、MDI、Combo View、模型树、Task、Data/View 属性、对话框、快捷键、上下文菜单、状态栏、Report/Jobs、3D 选择逐域拆分。每域分别采集空文档、活动文档、单选、多选、Task、错误、取消和恢复状态随后按工作台完成端到端流程。
退出条件:命令可见/启用、事务、焦点、选择、树、属性、视图和诊断均与 oracle 对齐;桌面和 390px 视口无重叠、溢出和无名控件。
### M12 文档与工程工作台
状态deferred。
顺序为 Draft -> Spreadsheet -> TechDraw -> Plot -> 跨工作台文档闭环Assembly -> BIM/IFC -> Surface -> Mesh/MeshPart -> Material。每个对象/命令仍按 A-I不按整个工作台一次性提升 exact。
退出条件:相关 exact 任务逐项完成,跨工作台链接、表达式、导出和保存重开无未知差异。
### M13 平台工作台、脚本与代理
状态deferred。
顺序为 FEM、CAM、Robot、Points/ReverseEngineering、Inspection/Measure、Python/Macro、Addon最后处理 Cloud/Help/IDF/JT/OpenSCAD 的 browser implementation、sidecar、proxy 或正式排除。安全边界先于功能数量。
退出条件:每项均有可执行策略、依赖/许可证/SBOM、能力限制和失败策略代理不得被标记 exact。
### M14 QA、跨浏览器与发布
状态deferred日常门禁持续运行。
- M14.1 Chrome 当前基线重跑。
- M14.2 Firefox/Safari 或明确不支持的可复核边界。
- M14.3 Windows/macOS/Linux 与 GPU/软件渲染矩阵。
- M14.4 键盘、屏幕阅读器、locale、长文本和窄屏。
- M14.5 fuzz、1000 次重算、长会话、崩溃、迁移和回滚。
- M14.6 性能、WASM/JS/GPU/OPFS 保留量与资源归零。
- M14.7 SBOM、许可证、签名、离线安装和发布回滚。
- M14.8 52/52 exact、34/34 exact、零未知差异的 promotion report。
退出条件:`EX-REL-01` 的所有前置完成promotion gate 从 fail-closed 报告自然变为通过,不能通过放宽断言或改写静态报告达成。
## 7. 执行顺序
当前只允许以下主顺序:
```text
M00
-> M01 ORA GUI workflows
-> M02 TSN drift
-> M03 TSN ordered pairs / real builders
-> M04 Property codecs
-> M05 Document semantics
-> M06 Kernel oracle slices
-> M07 Sketcher
-> M08 Part
-> M09 PartDesign
-> M10 FCStd/core formats
-> M11 GUI full replay
-> M12 document/engineering workbenches
-> M13 platform/script/proxy
-> M14 QA/release
```
只读 oracle 准备可以与当前实现任务交错,但不能让机器队列出现第二个 `in_progress`,也不能绕过依赖提前提升 exact 状态。
## 8. 每轮执行模板
1.`config/freecad-active-work-queue.json` 读取唯一 `nextTask`
2. 验证依赖与输入报告哈希,确认没有陈旧 artifact。
3. 只修改该任务直接影响的 oracle、实现、测试、报告和 blocker。
4. 先运行该域聚焦 probe/test再运行只读 check。
5. 运行 `test:facade`、相关 Chrome gate、`check:execution-plan`
6. 运行完整 `./npmw run verify``git diff --check` 和全部 JSON 解析。
7. 将当前任务改为 completed并只把直接后继改为 in_progress。
8. 更新 `docs/current-work.zh-CN.md` 的数字和下一任务;历史事实追加到 continuation 日志。
任何失败报告、资源泄漏、哈希陈旧、未知语义差异都优先于新增功能。
## 9. 本轮实际启动点
`ORA-GUI-WF-000` 已完成:首个命令族为 `partdesign-pad-task`,代表命令 `PartDesign_Pad`,主 exact 映射为 `EX-UI-03`,关联 `EX-ORA-01/EX-PD-01`。选择依据和五态配方保存在 `config/freecad-gui-workflow-plan.json`,由 `check:freecad-gui-workflow-plan` 校验。
`ORA-GUI-WF-001` 也已完成:锁定 FreeCAD 1.1.1 的 Pad 成功 GUI 工作流通过原生命令打开 Task点击 `Done` 后清理 edit 状态,得到 `PartDesign::Pad`、Body Tip=Pad、体积 120、6 面/12 边/8 点和 UndoCount=1。
`ORA-GUI-WF-002` 已完成:在独立原生进程中,`PartDesign_Pad``isActive()` 与 QAction 均为 falseQAction trigger 和 `Gui.runCommand()` 两条入口都未创建文档、Task 或事务。
`ORA-GUI-WF-003` 已完成open-wire profile 打开无效 Pad 预览,接受时原生报告 `Wire is not closed.`Task 保持打开;失败清理 reject 后临时 Pad 与事务被回滚,原有 Body/Sketch 状态保持不变。
`ORA-GUI-WF-004` 已完成17.5 mm Pad 预览为 210 体积的有效单实体reject 后临时 Pad、Tip 变化与事务全部回滚,活动 Body 保持不变。原生选择从 Sketch 被消费为空并保持为空;焦点从 3D View 进入 `lengthEdit`,取消后落到 TaskView而非恢复原 3D View。
`ORA-GUI-WF-005` 已完成open-wire Pad 首次接受产生 `Wire is not closed.`Task 保持可修正;同一 Task 内补齐闭合矩形并通过 `lengthEdit.rawValue` 输入 12 mm 后,预览和提交均为 6 面/12 边/8 点、体积 144 的有效单实体。Undo 回到两段 open-wire 且 Pad 不存在Redo 恢复 12 mm Pad保存、关闭重开、再次保存和再次重开均保持相同语义。
`ORA-GUI-WF-006` 已完成工作流计划、exact blocker、聚焦 checker 和活动队列同步Pad 命令族 7/7 关闭,但没有据此提升 `EX-ORA-01``EX-UI-03` 或系统 exact。
`TSN-DRIFT-000` 已完成:`partdesign-plain``Length 7 -> 7.75 -> 7` 在 Body 和 Pad 两个阶段恢复相同几何,但从首次创建命名演进为新的稳定历史。锁定报告与第二次独立 FreeCAD 1.1.1 复跑的逐阶段摘要一致,演进值又在 save/reopen/resave 中保持,因此分类为 `allowed_evolution`,不是 Web 实现缺陷。
`TSN-DRIFT-001` 已完成:`partdesign-midplane``Length 8 -> 8.75 -> 8` 在 Body11 和 Pad11 两个阶段恢复相同几何,关系与语义命名摘要演进为新的稳定历史。锁定报告与第二次独立 FreeCAD 1.1.1 复跑的逐阶段摘要一致,演进值在 save/reopen/resave 中保持,因此同样分类为 `allowed_evolution`,不是 Web 实现缺陷。
`TSN-DRIFT-002` 已完成:`partdesign-reverse``Length 5 -> 5.75 -> 5` 在 Body12 和 Pad12 两个阶段恢复相同几何,关系与语义命名摘要演进为新的稳定历史。锁定报告与第二次独立 FreeCAD 1.1.1 复跑的逐阶段摘要一致,演进值在 save/reopen/resave 中保持,因此同样分类为 `allowed_evolution`,不是 Web 实现缺陷。
`TSN-DRIFT-003` 已完成:`partdesign-taper``Length 6 -> 6.75 -> 6` 在 Body13 和 Pad13 两个阶段恢复相同几何,关系与语义命名摘要演进为新的稳定历史。锁定报告与第二次独立 FreeCAD 1.1.1 复跑的逐阶段摘要一致,演进值在 save/reopen/resave 中保持,因此同样分类为 `allowed_evolution`,不是 Web 实现缺陷。
`TSN-DRIFT-004..010` 与生产 `cut`/`rotate` 漂移均已完成独立复跑,并唯一分类为 `allowed_evolution`;恢复漂移队列因此关闭。
`fuse->pad` 已由原生 OCCT builder 和 FreeCAD `PartDesign::Pad` 文档路径稳定拒绝,事务 abort 后对象集与源 Shape 恢复,干净 FCStd save/reopen/resave 不受污染。`fuse->pocket` 已由真实 `BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut` 接受长度变异与恢复、history/naming 和 FCStd 三阶段均通过。唯一下一任务不在此手工记录,只读取生成状态。