28 KiB
FreeCAD Web 转换执行总计划
更新时间:2026-08-15
1. 目标、口径与真值
项目唯一目标是把锁定的 FreeCAD 1.1.1 能力迁移到浏览器,并保留 FreeCAD 的文档、属性、重算、拓扑命名、文件和交互语义。项目不是远程桌面、截图流,也不是只复刻界面的通用 Web CAD。
进度必须同时区分两种口径:
- 兼容实现口径:
config/freecad-execution-plan.json的 P01-P10 共 83 项均已完成,证明当前 Web 应用有可运行实现、门禁和明确能力边界。 - 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。
发生状态冲突时按以下顺序取真值:
config/freecad-web-exact-parity-plan.json:exact 任务、依赖、阻断项。config/release-capability-matrix.json:34 模块可对外声明的等级。config/freecad-active-work-queue.json:当前唯一在执行的微任务。config/freecad-execution-plan.json:兼容实现 P01-P10 的完成情况。config/*-verification.json、原生报告和 Chrome 报告:某个环境中的实际证据。- 本文与
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 个恢复命名阶段均已通过第二次独立原生复跑分类为允许演进。
- 生产命名链:五阶段 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. 目标架构和不可破坏边界
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 或有序操作对。每项按以下九个独立检查点推进:
A-inventory:锁定源码位置、TypeId/command id、依赖和适用对象。B-native-success:采集 FreeCAD 1.1.1 成功结果、状态、事件和资源。C-native-negative:分别采集 disabled、failure、cancel;不适用时保存可验证原因。D-native-mutation:编辑输入、重算、恢复,并记录逐阶段 Shape/history/naming。E-facade:在 Facade/Worker 边界内实现结构化合同和失败诊断。F-transaction:覆盖 Undo/Redo、abort、stale generation 和最后有效状态保留。G-roundtrip:FreeCAD 保存 -> Web 读取/修改/保存 -> FreeCAD 重开/再保存。H-browser:真实 Chrome Worker/WASM/OPFS 回放,结束后 Shape/Worker/资源归零。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 是一个独立任务:
- 确定
from输出类型与to输入前置。 - 在原生 FreeCAD 执行并记录接受或拒绝。
- 接受时使用真实 builder,采集 history/naming。
- 编辑
from参数并重算to。 - 恢复参数并分类命名/拓扑变化。
- 保存、重开、再保存并比较。
- 在生产 Worker 回放并检查释放。
- 拒绝时固定原生错误类型和文档未污染证据。
初始五阶段转换和 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.11:11 个 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 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. 执行顺序
当前只允许以下主顺序:
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. 每轮执行模板
- 从
config/freecad-active-work-queue.json读取唯一nextTask。 - 验证依赖与输入报告哈希,确认没有陈旧 artifact。
- 只修改该任务直接影响的 oracle、实现、测试、报告和 blocker。
- 先运行该域聚焦 probe/test,再运行只读 check。
- 运行
test:facade、相关 Chrome gate、check:execution-plan。 - 运行完整
./npmw run verify、git diff --check和全部 JSON 解析。 - 将当前任务改为 completed,并只把直接后继改为 in_progress。
- 更新
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 均为 false;QAction 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 三阶段均通过。唯一下一任务不在此手工记录,只读取生成状态。