feat: advance FreeCAD exact parity evidence
This commit is contained in:
@@ -1885,3 +1885,29 @@ Node 与真实 Chrome 的 19-operation 生产矩阵均重跑通过。17 类样
|
||||
扩展 `freecad-composite-history-elementmap-oracle` 的每个 30-case 流程:初次保存后关闭并重开,采集 ElementMap/`getElementMappedName()`;随后再次 `saveAs()`,再次关闭并重开,再采集同一组阶段和子形名称。报告新增 `nativeDesktopResaveCovered`、`resaveNameDrift` 及汇总计数,检查器要求 30/30 案例完成二次原生保存且 `roundtripNameDrift=0`、`resaveNameDrift=0`。
|
||||
|
||||
本轮实际结果为 30 个案例、219 个阶段、91 个 ElementMap2 资源和 11 个 StringHasher 资源全部通过;二次保存后的命名漂移为 `0`,`wrongBindings/unexplainedRelations/roundtripNameDrift` 等 exact gate 指标继续为零。EX-TSN-04 已把该门禁登记为证据,但仍保持 `in_progress`:生产 Worker 五阶段链与桌面 30-case 语料尚未完成逐阶段相关性对账,跨特征 mutation 矩阵也未穷尽。完整 `./npmw run verify`、构建、签名发布和 `git diff --check` 均通过。
|
||||
|
||||
## 241. 2026-08-14 EX-TSN-04 桌面五阶段关联与跨特征 mutation 门
|
||||
|
||||
新增锁定 FreeCAD 1.1.1 的 `freecad-tsn-stage-correlation-oracle`,按生产顺序执行 Cut→Rotate→Fillet→Mirrored→LinearPattern,采集每阶段 Shape、MappedName 摘要、`getElementHistory()` 来源图,并完成关闭、重开、二次 `saveAs()`、再次重开。该专用链与原 30-case corpus 合计形成 31 个桌面 resave 用例;新增链的 `wrongBindings=0`、`unexplainedRelations=0`、`roundtripNameDrift=0`、`resaveNameDrift=0`。exact history gate 现正式计入 `resaveNameDrift`,不再只检查首次 round-trip。
|
||||
|
||||
跨特征 mutation 对五个阶段各执行一次参数编辑、全链重算和恢复,5/5 参数与几何恢复通过;现有 35-family 报告能为 Cut、Fillet、Mirrored、LinearPattern 提供独立原生 mutation,对 Rotate 仍无注册 feature family。FreeCAD 的顺序 PartDesign 链拒绝继续变换 Mirrored 输出,原生错误为 `Only additive and subtractive features can be transformed`,因此专用顺序链的 Rotate、Mirrored、LinearPattern 仍只能标记为通用 Shape 代理,不能算原生 builder。Cut 与 Rotate 的恢复还导致 2/5 用例、5 个下游语义拓扑摘要变化,虽未形成错误绑定,仍阻断 exact。
|
||||
|
||||
新门禁将 19 类生产 operation 展开为 361 个有序组合;当前真实回放 4 个相邻转换,剩余 357 个尚未完成类型兼容分类。`EX-TSN-04` 因此保持 `in_progress`,机器化剩余量为 `native sequential builder=2/5`、`native mutation correlation=4/5`、`classified transition=4/361`。不得用当前零漂移结果越过这些显式阻断。
|
||||
|
||||
## 242. 2026-08-14 30-case 逐阶段 mutation 与恢复对账
|
||||
|
||||
`freecad-composite-history-elementmap-oracle` 已为固定的 `9 Boolean + 11 PartDesign + 6 复合 Boolean + 4 dress-up` 构造器增加逐案例 mutation 合同。Boolean 编辑 Cylinder.Radius,PartDesign 编辑 Pad.Length,复合 Boolean 编辑第一层基体 Box.Length,Fillet/Chamfer 分别编辑 Radius/Size;每个目标均由 FreeCAD 报告为原生可编辑 Property,并必须改变最终对象的解析几何摘要。采集器为 219 个阶段各保存 before/edited/restored 三相记录,共 657 条,包含稳定解析几何 digest、B-Rep SHA-256、relation digest 与 semantic-name digest。
|
||||
|
||||
锁定 FreeCAD 1.1.1 oracle 实跑为 `30/30 mutation pass`、最终传播失败 `0`、几何恢复失败 `0/219`。恢复后的文档状态作为实际 FCStd nominal 基线,再执行 save/reopen/resave;30/30 case、219/219 阶段保持 `roundtripNameDrift=0` 与 `resaveNameDrift=0`,91 个 ElementMap2 和 11 个 StringHasher 资源继续通过解析、写回与语义检查。恢复重算本身仍使 11 个 PartDesign case 的 28 个阶段产生 relation/semantic-name digest 演进;报告与 exact gate 将其作为独立非零指标保留,未把几何恢复等同于命名 exact。
|
||||
|
||||
新增共享 `freecad-composite-mutation-evidence` 校验器,锁定 30 个 case identity、四类配额、原生 Property/editor 状态、target/final stage ordinal、三相阶段 identity、最终传播和逐阶段恢复。TSN-04 checker 与 exact history gate 都按 case 一对一连接 resave 证据,任一案例缺失、重复、错序或局部指标不一致即失败。FreeCAD 来源子形解析同时覆盖 `FaceN/EdgeN/VertexN`、`#d:1`、`#42` 和 `g1v2;SKT` 原生语法;当前 `wrongBindings=0`、`unexplainedRelations=0`。`EX-TSN-04` 仍为 `in_progress`:除 28 个恢复命名摘要演进外,五阶段链仍有 3/5 proxy、rotate mutation family 缺失、5 个拓扑恢复 drift 和 357 个未分类 operation pair。
|
||||
|
||||
## 243. 2026-08-14 执行重审与首个 GUI 成功工作流
|
||||
|
||||
新增 `freecad-web-execution-master-plan.zh-CN.md`,重新区分 83/83 兼容任务与 5/52 exact 任务,按 ORA、TSN、Property、Document、Kernel、Sketcher、Part、PartDesign、FCStd、GUI、工程工作台、平台和发布拆出最小 A-I 验收步骤。机器队列继续保持 `maxInProgress=1`,不以文档计划替代原生和浏览器证据。
|
||||
|
||||
`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 保证命令敏感度与 1111 命令运行时清册一致。
|
||||
|
||||
`ORA-GUI-WF-001` 随后在隔离 Xvfb 的锁定 FreeCAD 1.1.1 桌面进程真实执行。原生命令从已选矩形 Sketch 打开 Pad Task,TaskView 的实际接受按钮为 `Done`;接受并清理 edit 状态后得到 `PartDesign::Pad`,Body Group 为 `Sketch,Pad`、Tip=Pad、Profile=Sketch、Length=10,实体为 6 面/12 边/8 点、体积 120、状态 Up-to-date,UndoCount=1。报告只声明 success,remainingStates 仍为 disabled/failure/cancel/recovery。队列前移为 112 completed、1 in_progress、374 pending,唯一下一项是 `ORA-GUI-WF-002`。
|
||||
|
||||
本轮完整 `./npmw run verify` 以退出码 0 完成,生产构建、79 个签名发布文件、34 模块 release closure 和 Ed25519 验签通过;能力矩阵仍准确保持 0 exact、26 compatible、5 proxy、3 development。
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
- exact 计划共 52 项:`5 completed`、`36 in_progress`、`11 pending`。
|
||||
- 已完成的 exact 项只有 `EX-TSN-00..03` 和 `EX-PD-02`:原生命名证据边界、逐阶段历史、生产私有命名、同构来源处理,以及 Attachment/XLink 生命周期。
|
||||
- exact 发布任务 `EX-REL-01` 仍为 `pending`,34 个模块都不得提升为 exact。
|
||||
- 当前工作树包含 TSN 逐阶段相关性、Property 状态/codec、CAM/LinuxCNC 验证资产、oracle 清册分类和首个 Pad GUI 工作流增量;聚焦门禁、完整 `verify`、发布产物验签和最终差异校验均已通过。
|
||||
|
||||
状态冲突时按以下顺序取真值:
|
||||
|
||||
@@ -27,6 +28,8 @@
|
||||
4. `config/*-verification.json` 和原生 oracle:某次具体环境运行的证据。
|
||||
5. `docs/continuation-status.zh-CN.md`:按时间追加的历史日志,不作为当前总状态入口。
|
||||
|
||||
状态字段需要结合依赖读取:`in_progress` 只表示已有证据或实现,不表示当前可直接关闭;少数 `completed` 项是按自身验收范围关闭的独立切片,即使它引用的更大上游任务仍开放,也不能反推整条依赖链已经完成。
|
||||
|
||||
## 3. 当前架构主链
|
||||
|
||||
```text
|
||||
@@ -47,19 +50,38 @@ FCStd / STEP / IGES / mesh / engineering resources
|
||||
|
||||
任何新功能都必须接入这条主链,不能从 React 绕过 Facade 直接调用 Three.js、OCCT、文件系统或持久化实现。
|
||||
|
||||
## 4. 执行优先级
|
||||
## 4. 关键依赖链
|
||||
|
||||
```text
|
||||
EX-ORA-01 -> EX-ORA-02 -> EX-KER-01
|
||||
| |
|
||||
+-> EX-DOC-01 +-> EX-PART-01 -> EX-PD-01
|
||||
| ^
|
||||
EX-TSN-00..03 -> EX-TSN-04 -----------+
|
||||
| |
|
||||
| +-> EX-DOC-02
|
||||
| |
|
||||
+--------------+-> EX-DOC-04 -> EX-FC-01
|
||||
EX-DOC-01 -> EX-DOC-03 ---------^
|
||||
|
||||
核心链闭合后 -> GUI/工作台 -> 跨浏览器 QA -> EX-REL-01
|
||||
```
|
||||
|
||||
当前形式上没有未完成前置的 P0 根任务只有 `EX-ORA-01` 和 `EX-TSN-04`。`EX-DOC-01` 已有可继续收敛的局部实现,但整体关闭仍依赖 `EX-ORA-01`;Sketcher、Part、PartDesign、FCStd 和 CAM 不作为当前新增范围,除非它们是关闭上述根任务所需的验证夹具。
|
||||
|
||||
## 5. 执行优先级
|
||||
|
||||
### P0-A:锁定完整原生 oracle
|
||||
|
||||
对应 `EX-ORA-01/02`。穷尽运行时 TypeId、Property、GUI command、成功/失败/取消状态和 feature-family mutation 夹具。没有原生基线的功能不进入 exact 实现判断。
|
||||
对应 `EX-ORA-01/02`。当前隔离配置下有 1111 个工作台启动命令、19 个 source-only 命令和 2 个上下文延迟命令;1111 个启动命令已拆为 100 个独立原生分片,全部完成 no-document/document/selection 三状态采样。首个 `PartDesign_Pad` 命令族已完成选择和原生成功 Task 工作流,下一项只采集无活动文档时的 disabled 状态;failure、cancel、recovery 与其他命令族仍保持开放。没有原生基线的功能不进入 exact 实现判断。
|
||||
|
||||
### P0-B:关闭跨特征拓扑命名
|
||||
|
||||
对应 `EX-KER-01`、`EX-TSN-04`。完成生产 Worker 五阶段链与桌面 30-case 逐阶段对账,补齐跨特征 mutation 矩阵、builder flags 和失败分支。目标是错误绑定、未解释关系和保存重开名称漂移均为零。
|
||||
对应 `EX-KER-01`、`EX-TSN-04`。锁定 30-case corpus 已按 `9 Boolean + 11 PartDesign + 6 复合 Boolean + 4 dress-up` 逐案例执行原生属性编辑,30/30 都传播到最终 Shape,219/219 阶段几何恢复,657 条 before/edited/restored 阶段记录完成 fail-closed 对账;恢复状态再保存、重开、二次保存后的错误绑定、未解释关系和名称漂移均为零。FreeCAD 重算仍使 11 个 PartDesign 案例的 28 个 mutation 恢复阶段产生原生命名摘要演进。生产 Worker 五阶段链另有 5/5 几何编辑恢复,但顺序链只有 2/5 原生 builder,3/5 为通用 Shape 代理,rotate 缺少原生 mutation family,2/5 恢复用例的 5 个下游语义拓扑摘要发生变化,19 类生产操作的 361 个有序组合仅分类回放 4 个,因此门禁继续 fail-closed。
|
||||
|
||||
### P0-C:关闭 App 文档语义
|
||||
|
||||
对应 `EX-DOC-01/02/03`。当前 85 种运行时 Property 中仍有 62 种只能 opaque 保存。15 类已观察到的 Property status 均已进入类型化位掩码和 FCStd 无损读写,其中 13 类已由锁定的 FreeCAD 1.1.1 探针和 Facade 行为覆盖:`Output/PropOutput` 不 touch,`PropNoRecompute` 只传播依赖对象,`Transient/PropTransient` 保留定义但跳过值,`PropNoPersist` 完全省略。`LockDynamic` 和 `PartialTrigger` 仍是保存与原生 oracle 记录,尚未进入动态属性结构变更和 partial document observer 行为。后续依次补齐剩余 Property codec/editor、事务与 observer 顺序、局部重算失败、Extension 和 FeaturePython 边界。
|
||||
对应 `EX-DOC-01/02/03`。85 种运行时 Property、5510 条记录中,22 种/4304 条已有通用原生 codec,5 种/683 条已有专用 codec,仍有 58 种/523 条只能 opaque 保存。15 类已观察到的 Property status 均已进入类型化 Facade 行为;`LockDynamic` 的动态属性增删改事务和 `PartialTrigger` 的 partial-document observer 行为已有原生 oracle 与 Facade 测试。后续依次补齐剩余 Property codec/editor、完整 observer 顺序、局部重算失败、Extension 和 FeaturePython 边界。
|
||||
|
||||
### P0-D:关闭核心建模语义
|
||||
|
||||
@@ -71,7 +93,42 @@ FCStd / STEP / IGES / mesh / engineering resources
|
||||
|
||||
P1/P2 的 GUI 全量对标、其他工作台、代理模块和跨浏览器发布,必须在上述 P0 主链有明确前置证据后推进。当前不再以增加工作台数量作为主要进度指标。
|
||||
|
||||
## 5. 每项工作的完成定义
|
||||
## 6. 里程碑队列
|
||||
|
||||
按下表自上而下推进。并行上限为“一个实现里程碑 + 一个只读 oracle 准备项”;未达到退出条件时,不切换到新的工作台或长尾模块。
|
||||
|
||||
| 顺序 | 任务 | 当前状态 | 交付范围 | 退出条件 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| M0 | 收口当前工作树 | `completed` | 将 TSN、Property、CAM/LinuxCNC 三组已有增量分别核对证据和边界,不再混入新功能 | 聚焦门禁、完整 `verify`、`git diff --check`、全部 JSON 解析通过;计划与报告无陈旧哈希 |
|
||||
| M1 | `EX-ORA-01` 运行时清册闭合 | `in_progress` | 对 352 个注册对象、1111 个启动 GUI command、19 个 source-only command、2 个 context-only command 和 GUI 工作流状态生成差异账本 | 每个候选均为 runtime-backed 或有机器可读排除原因;成功/禁用/失败/取消/恢复工作流未知项为零 |
|
||||
| M2 | `EX-TSN-04A` 漂移判定 | `ready-after-M0` | 逐项解释 11 个 PartDesign case 的 28 个恢复命名摘要演进,以及五阶段链的 5 个恢复拓扑变化 | 每个差异都有 FreeCAD 复跑证据并被判定为稳定语义、允许演进或实现缺陷;未知项为零,缺陷有回归测试 |
|
||||
| M3 | `EX-TSN-04B` 转换矩阵闭合 | `after-M2` | 将 19×19 的 361 个有序操作对按原生输入/输出类型分类;原生允许的组合使用真实 builder 回放,原生拒绝的组合保存失败 oracle | 361/361 已分类;可执行组合的 history/naming/mutation/resave 通过;不可执行组合的原生错误可复现;不再用通用 Shape 代理冒充 feature builder |
|
||||
| M4 | `EX-DOC-01` Property 批次 | `after-M1` | 先做高复用 App 类型与链接/列表类型,再处理 Material、File、PythonObject 等带安全或工作台边界的类型 | 每批均具备原生值/状态/editor oracle、Facade codec、FCStd reopen/resave、Undo/Redo 和 Chrome 证据;opaque 数量只按机器报告下降 |
|
||||
| M5 | `EX-DOC-02/03` 文档闭环 | `after-M3+M4` | observer 顺序、事务 abort、局部重算失败、Extension、FeaturePython、copy/clone/delete/relink | 原生与浏览器事件序列一致;失败不污染最后有效状态;资源归零;随后再推进 `EX-DOC-04` |
|
||||
| M6 | `EX-ORA-02/KER/PART/PD/SK` 纵向切片 | `after-M2+M5` | 由 oracle 差异报告选择一个特征族,一次完成参数、失败、恢复、history、命名、FCStd 和 UI Task 生命周期 | 单特征全部证据通过后才选择下一族;不按整个工作台批量提升 exact |
|
||||
| M7 | `EX-FC-01/FMT-01` | `after-M3+DOC-04` | 所有已支持对象、Property、Shape、ElementMap2、StringHasher 的 FreeCAD-Web-FreeCAD 双向 mutation;随后补 STEP/IGES 高级元数据 | 两次保存重开后无未知语义漂移,未知资源按合同保留,格式差异全部登记 |
|
||||
| M8 | `EX06..EX10` | `deferred` | GUI 全量、生产/工程工作台、代理策略、跨浏览器、性能、安全和发布 | 52/52 exact 任务、34/34 exact 模块及最终 promotion report 全部满足后才执行 `EX-REL-01` |
|
||||
|
||||
M3 不要求把 FreeCAD 本身拒绝的组合强行实现为顺序特征链。正确证据是:先由原生 FreeCAD 判断组合是否合法,再分别保存成功 builder 证据或稳定失败证据。M4 也不按记录数盲目排序;`PropertyPythonObject`、文件路径和 Material 类型必须先确定执行、安全和资源边界。
|
||||
|
||||
### 6.1 微任务队列
|
||||
|
||||
机器真值为 `config/freecad-active-work-queue.json`,由 `generate:freecad-active-work-queue` 从原生报告生成,并由 `check:freecad-active-work-queue` fail-closed 校验。当前共 487 个微任务:112 `completed`、1 `in_progress`、374 `pending`;`maxInProgress=1`,唯一下一任务是 `ORA-GUI-WF-002`。
|
||||
|
||||
| 微里程碑 | 任务粒度 | 数量 | 状态 | 下一退出条件 |
|
||||
| --- | --- | ---: | --- | --- |
|
||||
| `ORA-GUI-BASELINE` | 1 个配置边界或 1 个 GUI 命令分片 | 106 | 106 completed | 已关闭:100/100 分片、1111/1111 命令状态、2 个上下文延迟命令均有证据 |
|
||||
| `ORA-GUI-WORKFLOWS` | 1 个命令族的 1 种工作流状态 | 7 | 2 completed / 1 in_progress / 4 pending | `PartDesign_Pad` 选择与成功 Task 已完成;当前只执行 `ORA-GUI-WF-002` disabled 状态 |
|
||||
| `TSN-RECOVERY-DRIFT` | 1 个原生 case 或 1 个生产 mutation | 13 | 13 pending | GUI workflow 七步关闭后,从 `partdesign-plain` 单 case 开始 |
|
||||
| `TSN-ORDERED-PAIRS` | 1 个有序操作对 | 361 | 4 completed / 357 pending | 每次只分类并回放一个 `from->to`,不按特征族批量关闭 |
|
||||
|
||||
`ORA-GUI-WORKFLOWS` 严格按七步执行:选定命令族、成功、禁用、失败、取消、恢复、更新 blocker/门禁。一步只新增一种原生状态证据,前一步未通过时不启动后一步。
|
||||
|
||||
`TSN-RECOVERY-DRIFT` 的 13 个独立任务按以下顺序执行:`partdesign-plain`、`partdesign-midplane`、`partdesign-reverse`、`partdesign-taper`、`partdesign-twoside`、`partdesign-pocket`、`partdesign-pocket-through`、`partdesign-pocket-midplane`、`partdesign-pocket-twoside`、`partdesign-pocket-taper`、`partdesign-pocket-up-to-face`、生产 `cut`、生产 `rotate`。每个任务只允许一种结论:稳定语义、允许演进或实现缺陷;不得以几何恢复代替命名解释。
|
||||
|
||||
100 个 GUI 分片分别对应 `ORA-GUI-SHARD-000..099`,每片覆盖排序命令全集中的 11 或 12 个命令。每片有独立报告、SHA-256、起止索引和退出条件;合并器要求 100 个区间连续、1111 个 ID 唯一且全集哈希一致。
|
||||
|
||||
## 7. 每项工作的完成定义
|
||||
|
||||
一个 FreeCAD 能力只有同时具备以下证据,才可关闭对应 exact 任务:
|
||||
|
||||
@@ -84,15 +141,49 @@ P1/P2 的 GUI 全量对标、其他工作台、代理模块和跨浏览器发布
|
||||
7. 聚焦测试、相关 Chrome gate、计划/能力矩阵和差异说明同步更新。
|
||||
8. exact promotion gate 不依靠改写报告或放宽断言通过。
|
||||
|
||||
## 6. 近期工作队列
|
||||
## 8. 验证矩阵
|
||||
|
||||
1. 保持现有验证资产可复现,先处理任何 `failed` 浏览器 gate,再开始新里程碑。
|
||||
2. 完成 `EX-TSN-04` 的生产五阶段链与桌面 resave 逐阶段相关性对账。
|
||||
3. 从 `EX-ORA-02` 输出的 feature-family 缺口中选择一个 P0 特征族,补齐 mutation、失败、恢复、round-trip 全证据。
|
||||
4. 以原生 Property 缺口报告为输入推进 `EX-DOC-01`,每批只提升有 codec 和状态语义证据的类型。
|
||||
5. 每个里程碑运行聚焦检查;准备合并时再运行 `./npmw run verify`、`git diff --check` 和 JSON 校验。
|
||||
每次修改先运行所属聚焦门禁;只有聚焦门禁通过后才运行全量门禁。
|
||||
|
||||
## 7. 明确不做
|
||||
TSN/命名批次:
|
||||
|
||||
```bash
|
||||
./npmw run check:freecad-composite-history-elementmap
|
||||
./npmw run check:freecad-tsn-stage-correlation
|
||||
./npmw run check:freecad-exact-history-elementmap-gate
|
||||
./npmw run check:freecad-naming-production
|
||||
./npmw run check:chrome-freecad-naming-production
|
||||
```
|
||||
|
||||
Property/文档批次:
|
||||
|
||||
```bash
|
||||
./npmw run check:freecad-native-property-semantics
|
||||
./npmw run check:freecad-property-status
|
||||
./npmw run test:facade
|
||||
./npmw run check:freecad-fcstd-roundtrip
|
||||
./npmw run check:chrome-fcstd-semantic
|
||||
```
|
||||
|
||||
合并前统一门禁:
|
||||
|
||||
```bash
|
||||
./npmw run check:execution-plan
|
||||
./npmw run verify
|
||||
git diff --check
|
||||
find config -maxdepth 1 -type f -name '*.json' -print0 | xargs -0 -n1 jq empty
|
||||
```
|
||||
|
||||
若修改了 oracle/harness 或验证报告生成逻辑,必须先实际执行对应 `probe:*`/`test:chrome-*`,再运行只读 `check:*`;静态旧报告不能作为完成证据。
|
||||
|
||||
## 9. 维护规则
|
||||
|
||||
- 本文只维护当前状态、关键路径和下一批队列;长期范围仍由 exact JSON 账本管理,历史事实只追加到 continuation 日志。
|
||||
- 每个里程碑只更新自己直接影响的实现、测试、verification、exact blocker 和能力矩阵,不顺手刷新无关报告。
|
||||
- `completed` 必须对应机器账本中的验收范围;局部进展写入 blocker 数字,不提前改状态。
|
||||
- 任何 `failed` 浏览器 gate、陈旧 artifact hash、资源泄漏或未知语义差异优先于新增能力。
|
||||
|
||||
## 10. 明确不做
|
||||
|
||||
- 不把项目改成远程桌面、服务端截图流或仅 UI 仿制品。
|
||||
- 不新增绕过 Facade 的几何、渲染、脚本或存储入口。
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
2. 生成 TypeId、Property、GUI command、format、entrypoint inventory;每个候选必须有源码位置和 runtime 状态。
|
||||
3. 建立成功、失败、禁用、取消、重算、保存重开六类 oracle fixture。
|
||||
4. 运行 `npm run check:freecad-inventory`、`check:freecad-type-properties`、`check:freecad-gui-commands`、`check:freecad-entrypoints`。
|
||||
5. 运行 `npm run check:freecad-oracle-coverage`,核对 34 个模块和 1113 个 GUI 命令是否与真实桌面报告逐项一致;该 gate 同时报告未构建模块和仍待逐对象 probe 的静态候选。
|
||||
5. 运行 `npm run check:freecad-oracle-coverage`,核对 34 个模块、1111 个工作台启动 GUI 命令、19 个 source-only 命令和 2 个 context-only 命令是否与隔离的真实桌面报告逐项一致;该 gate 同时报告未构建模块和仍待逐对象 probe 的静态候选。
|
||||
6. 运行 `npm run check:freecad-golden-coverage`,按 feature family 核对成功、失败、history、复合阶段、ElementMap2、FCStd 往返和浏览器回放七个维度;用 `-- --details` 输出逐 family 缺口。新增原生 feature-family fixture 时必须同时通过 `test:golden:freecad:families` 和 `test:golden:freecad:family-failures`,任何 missing 项继续保留为 EX-ORA-02 blocker。
|
||||
7. 运行 `npm run check:freecad-partdesign-failures`、`npm run check:freecad-partdesign-revolution-groove`、`npm run check:freecad-partdesign-transform` 和 `npm run check:freecad-part-builders`。原生缺输入后仍为 `Up-to-date + Valid + null Shape` 的 feature 必须分类为 `accepted-empty`,不能计入失败覆盖;只有真实 rejected 诊断才能关闭 `failure-fixture` 维度。局部重算失败保留旧 Shape 时,必须同时保存 `Invalid` 状态、原生诊断和 stale Shape,不得把旧 Shape 当作成功结果。
|
||||
|
||||
|
||||
@@ -421,6 +421,14 @@ EX-ORA-02 的 mutation corpus 由 `config/freecad-parameter-mutation-plan.json`
|
||||
|
||||
30 个复合模型的 219 个文档阶段已通过 FreeCAD 运行时 `getElementMappedName/getElementIndexedName/getElementHistory` 获得直接命名证据,并由两个门禁逐阶段验证。此处的 `native-evidence=219/219` 不等于内部 builder exact:219 个阶段都有 IndexedName,但只有 74 个阶段的全部子形有 MappedName,145 个阶段只有原生索引身份;当前识别出的 42 个操作阶段仍为 `internalBuilderEvidence=0`。没有内部 builder Shape/history 时,最终几何不能用于制造中间 Generated/Modified/Deleted;没有实际 StringHasher/MappedNameRef 时也不能制造私有 token;同构候选没有唯一原生来源时继续持久化为 ambiguous。
|
||||
|
||||
### 22.1 30-case 原生 mutation 与恢复门(2026-08-14)
|
||||
|
||||
`freecad-composite-history-elementmap-oracle` 现把固定语料锁定为 `9 Boolean + 11 PartDesign + 6 复合 Boolean + 4 dress-up`,每个 case 声明目标对象、原生 Property TypeId、editor mode、编辑值和最终对象。采集器对每个 case 执行 before/edit/recompute/restore/recompute,并为全部 219 个阶段保存三相几何、关系和命名摘要,共 657 条阶段记录。解析几何摘要包含拓扑计数、包围盒、顶点坐标、边长、面面积、面积和体积,不依赖 B-Rep 文本中的瞬时内部布局;原始 B-Rep SHA-256 仍单独保留作证据。
|
||||
|
||||
锁定 FreeCAD 1.1.1 实跑结果为 `mutation=30/30`、最终传播失败 `0`、几何恢复失败 `0/219`。mutation 恢复后的状态才作为 FCStd nominal 基线,30 个 case 再完成 save/reopen/resave,219 个阶段的 `roundtripNameDrift=0`、`resaveNameDrift=0`。FreeCAD 重算过程中,11 个 PartDesign case 的 28 个阶段在参数恢复后产生不同的原生 relation/semantic-name digest;该差异被单独锁定为 mutation naming drift,不能与几何恢复混算,也不能被零保存漂移掩盖。
|
||||
|
||||
`check:freecad-composite-history-elementmap`、`check:freecad-tsn-stage-correlation` 和 `check:freecad-exact-history-elementmap-gate` 共同按 case id、类别配额、stage ordinal 和三相 identity fail-closed。来源解析同时接受 FreeCAD 原生 `FaceN/EdgeN/VertexN`、`#d:1`、`#42` 与 `g1v2;SKT` 语法,不再把原生局部 token 误判为未解释关系。当前三门结果均为 `wrongBindings=0`、`unexplainedRelations=0`,但 mutation naming drift、五阶段 proxy/builder 缺口及未分类操作对仍使 `EX-TSN-04=in_progress`、`exactPromotionReady=false`。
|
||||
|
||||
### 23. EX-PD-02 Attachment 与跨文档引用闭合(2026-08-13)
|
||||
|
||||
`EX-PD-02` 已按独立机器证据关闭。FreeCAD 1.1.1 原生 Attachment 注册表仍为 55 项,四类引擎实现并集为 50 项;新增全组合 oracle 将 Plane/Sketch/Line/Point 的所有模式及所有引用组合展开为 236 个可执行槽位。每项都通过初始重算、统一源几何平移和 FCStd 关闭重开,Placement 与支持引用无漂移。原有未实现模式反例仍要求 `Touched + Invalid`,不会因本批完整执行覆盖而被误判为实现。
|
||||
|
||||
373
docs/freecad-web-execution-master-plan.zh-CN.md
Normal file
373
docs/freecad-web-execution-master-plan.zh-CN.md
Normal file
@@ -0,0 +1,373 @@
|
||||
# FreeCAD Web 转换执行总计划
|
||||
|
||||
更新时间:2026-08-14
|
||||
|
||||
## 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 pending;34 个模块为 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 阻断
|
||||
|
||||
- Oracle:352 个注册对象、348 个可实例化对象、4 个不可实例化对象、1111 个启动 GUI command、19 个 source-only command 和 2 个 context-only command 已分类;命令族的成功、禁用、失败、取消、恢复流程仍未穷尽。
|
||||
- Property:85 种运行时类型、5510 条记录中,22 种/4304 条为通用原生 codec,5 种/683 条为专用 codec,58 种/523 条仍为 opaque proxy。
|
||||
- Property status:15 类已观察状态均已进入类型化 Facade 行为;`LockDynamic` 和 `PartialTrigger` 已有原生事务证据,但完整 observer 与局部重算序列未关闭。
|
||||
- TSN:30/30 原生 mutation、219/219 几何阶段恢复通过;11 个 PartDesign case 的 28 个恢复命名摘要演进仍需逐 case 解释。
|
||||
- 生产命名链:五阶段 5/5 几何恢复,但仍有 3/5 通用 Shape 代理、缺 rotate mutation family、5 个下游语义拓扑恢复漂移。
|
||||
- 有序操作:19×19 共 361 对,仅 4 对已有分类回放,357 对待原生接受/拒绝判定。
|
||||
- FCStd:支持的原生 codec 与未知资源保留已有证据,但所有对象/属性/Extension/Shape/ElementMap2/StringHasher 的 FreeCAD-Web-FreeCAD 双向变异未穷尽。
|
||||
- GUI:应用壳和代表性工作流已有浏览器证据,但动态命令、Task、对话框、焦点、上下文和逐工作台流程没有完整原生对照。
|
||||
- 发布:系统级 exact 为 false,`EX-REL-01` 为 pending,跨浏览器、长期运行和全模块 exact promotion 尚未开始。
|
||||
|
||||
## 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 工作流,执行中。
|
||||
- `ORA-GUI-WF-003`:只采集无效 open-wire profile 的 failure 工作流。
|
||||
- `ORA-GUI-WF-004`:只采集预览后 Cancel 的回滚、选择和焦点工作流。
|
||||
- `ORA-GUI-WF-005`:只采集失败/取消后修复、成功、Undo/Redo、保存重开的恢复工作流。
|
||||
- `ORA-GUI-WF-006`:更新 exact blocker、聚焦门禁和下一命令族选择规则。
|
||||
|
||||
### 5.3 TSN 恢复漂移,13 项,待 ORA 工作流
|
||||
|
||||
按以下顺序一次解释一个 case:
|
||||
|
||||
1. `partdesign-plain`
|
||||
2. `partdesign-midplane`
|
||||
3. `partdesign-reverse`
|
||||
4. `partdesign-taper`
|
||||
5. `partdesign-twoside`
|
||||
6. `partdesign-pocket`
|
||||
7. `partdesign-pocket-through`
|
||||
8. `partdesign-pocket-midplane`
|
||||
9. `partdesign-pocket-twoside`
|
||||
10. `partdesign-pocket-taper`
|
||||
11. `partdesign-pocket-up-to-face`
|
||||
12. 生产 `cut`
|
||||
13. 生产 `rotate`
|
||||
|
||||
每项必须得到且只能得到一种结论:FreeCAD 稳定语义、允许的命名演进、实现缺陷。实现缺陷必须增加回归测试;未知不能作为结论。
|
||||
|
||||
### 5.4 TSN 有序操作对,361 项,4 完成/357 待办
|
||||
|
||||
操作全集为 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. 拒绝时固定原生错误类型和文档未污染证据。
|
||||
|
||||
已覆盖的四对为 `cut->rotate`、`rotate->fillet`、`fillet->mirrored`、`mirrored->linear-pattern`。其余严格按机器队列逐对领取。
|
||||
|
||||
## 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 工作流闭合
|
||||
|
||||
状态:执行 `ORA-GUI-WF-002`。
|
||||
|
||||
先完成 Pad 七步,再按风险选择下一族。每个后续命令族仍拆成 success/disabled/failure/cancel/recovery/update 六个状态任务。选择顺序:核心文档命令 -> Sketcher 创建/编辑 -> PartDesign 参数 Task -> Part builder -> FCStd import/export -> 其他工作台。
|
||||
|
||||
退出条件:每个运行时命令归入一个工作流族;每族五态都有原生证据或机器可读不适用原因;未知 GUI 状态为零。
|
||||
|
||||
### M02 `EX-TSN-04A` 恢复漂移闭合
|
||||
|
||||
状态:等待 M01。
|
||||
|
||||
- M02.1-M02.11:11 个 PartDesign case,逐 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 转换矩阵
|
||||
|
||||
状态:等待 M02。
|
||||
|
||||
- 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 Material:App PropertyMaterial/PropertyMaterialList 与 Materials::PropertyMaterial,先固定 schema、继承和资源边界。
|
||||
- M04.E 文件资源:PropertyFile、PropertyFileIncluded、PropertyPath,禁止把宿主绝对路径写入浏览器项目。
|
||||
- M04.F PythonObject:先定义禁止执行、可信序列化、代理编辑和迁移边界,再决定 codec;不得反序列化执行任意 Python。
|
||||
- M04.G 几何/求解内核:Part ShapeHistory/TopoShapeList/FilletEdges,Mesh MeshKernel/CurvatureList,Fem FemMesh/PostDataObject,Points PointKernel,Robot Trajectory。
|
||||
- M04.H 工作台专用:Spreadsheet Sheet/RowHeights/ColumnWidths,TechDraw CenterLine/CosmeticEdge/CosmeticVertex/GeomFormat lists,Inspection 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-I:Box、Cylinder、Cone、Sphere、Torus、Prism、Wedge、Helix、Ellipsoid;Extrusion、Revolution、Loft、Sweep;Fuse、Cut、Common;Fillet、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-I,Body 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` 的 disabled 状态,并证明调用被阻止且不创建文档、Task 或事务。failure/cancel/recovery 必须留给各自后继任务。
|
||||
Reference in New Issue
Block a user