feat: advance FreeCAD exact parity evidence
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

This commit is contained in:
2026-08-14 22:39:16 -04:00
parent e3373c9d6c
commit 5bbd7b9d4f
64 changed files with 113069 additions and 21074 deletions

View File

@@ -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.RadiusPartDesign 编辑 Pad.Length复合 Boolean 编辑第一层基体 Box.LengthFillet/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/resave30/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 TaskTaskView 的实际接受按钮为 `Done`;接受并清理 edit 状态后得到 `PartDesign::Pad`Body Group 为 `Sketch,Pad`、Tip=Pad、Profile=Sketch、Length=10实体为 6 面/12 边/8 点、体积 120、状态 Up-to-dateUndoCount=1。报告只声明 successremainingStates 仍为 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。

View File

@@ -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 都传播到最终 Shape219/219 阶段几何恢复657 条 before/edited/restored 阶段记录完成 fail-closed 对账;恢复状态再保存、重开、二次保存后的错误绑定、未解释关系和名称漂移均为零。FreeCAD 重算仍使 11 个 PartDesign 案例的 28 个 mutation 恢复阶段产生原生命名摘要演进。生产 Worker 五阶段链另有 5/5 几何编辑恢复,但顺序链只有 2/5 原生 builder3/5 为通用 Shape 代理rotate 缺少原生 mutation family2/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 条已有通用原生 codec5 种/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 的几何、渲染、脚本或存储入口。

View File

@@ -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 当作成功结果。

View File

@@ -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 exact219 个阶段都有 IndexedName但只有 74 个阶段的全部子形有 MappedName145 个阶段只有原生索引身份;当前识别出的 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/resave219 个阶段的 `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`,不会因本批完整执行覆盖而被误判为实现。

View 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 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 条记录中22 种/4304 条为通用原生 codec5 种/683 条为专用 codec58 种/523 条仍为 opaque proxy。
- Property status15 类已观察状态均已进入类型化 Facade 行为;`LockDynamic``PartialTrigger` 已有原生事务证据,但完整 observer 与局部重算序列未关闭。
- TSN30/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.1111 个 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 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` 的 disabled 状态并证明调用被阻止且不创建文档、Task 或事务。failure/cancel/recovery 必须留给各自后继任务。