feat: complete production naming and reference lifecycle gates
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 10:10:30 -04:00
parent f97eae4153
commit f64b78865c
75 changed files with 57290 additions and 15675 deletions

View File

@@ -1832,10 +1832,56 @@ SDK-05 又建立了独立 pthread OCCT 构建和 `.cache/candidates/freecad-nami
该文档真实保存为 FCStd、关闭、重新打开并重算四个 Body 的 Group/Tip、Datum 支撑/MapMode/Offset、两类 Binder 引用与形状、无效支持诊断全部保持。执行与检查命令已分离为 `probe:freecad-partdesign-structure``check:freecad-partdesign-structure`,并纳入真实 oracle lane 和默认 Sketcher/PartDesign 门禁。
同一 oracle 又增加双 FCStd 跨文档场景。原生 `ShapeBinder.Support` 虽报告为 `App::PropertyLinkSubListGlobal`,但直接赋外部文档对象仍明确返回 `PropertyLinkSubList does not support external object``SubShapeBinder.Support``App::PropertyXLinkSubList`,在源/消费文档均已落盘后接受 `ExternalBox.Face1`。关闭并按源→消费顺序重开后 XLink 仍指向源文档,源 Width 编辑使 Face1 与 SubShapeBinder 面积同步 `30→48`。删除源对象时 FreeCAD 清空 XLink但保留面积 48 的最后形状缓存,且状态仍为 `Up-to-date/Valid`检查器锁定了这一非直觉生命周期语义。EX-PD-02 仍为 pending完整 Attachment 组合、其他 XLink/重新链接恢复与 Web Chrome 生命周期尚未闭合
同一 oracle 又增加双 FCStd 跨文档场景。原生 `ShapeBinder.Support` 虽报告为 `App::PropertyLinkSubListGlobal`,但直接赋外部文档对象仍明确返回 `PropertyLinkSubList does not support external object``SubShapeBinder.Support``App::PropertyXLinkSubList`,在源/消费文档均已落盘后接受 `ExternalBox.Face1`。关闭并按源→消费顺序重开后 XLink 仍指向源文档,源 Width 编辑使 Face1 与 SubShapeBinder 面积同步 `30→48`。删除源对象时 FreeCAD 清空 XLink但保留面积 48 的最后形状缓存,且状态仍为 `Up-to-date/Valid`;检查器锁定了这一非直觉生命周期语义。本节完成时 EX-PD-02 仍为 pending;第 236 节已补齐当时剩余的完整 Attachment 组合、其他 XLink/重新链接恢复与 Web Chrome 生命周期。
## 235. 2026-08-13 PAR-01 Attachment 注册表与引擎分区 oracle
新增独立 `freecad-attachment-mode-oracle`,从锁定 FreeCAD 1.1.1 运行时读取 `MapMode` 的永久枚举顺序和 `Attacher` 元数据。真实注册表为 55 项Plane 与 Sketch 的 `AttachEnginePlane` 各实现 23 项Line 的 `AttachEngineLine` 实现 18 项Point 的 `AttachEnginePoint` 实现 9 项,实现并集为 50 项。`Deactivated` 是关闭状态,`TangentU``TangentV``IntersectionPoint``MidPoint` 未出现在这四类引擎的实现集合。报告为每个实现模式保留永久索引和完整 `ReferenceCombinations`,从而将“枚举可写”与“当前引擎实际实现”分开。
代表性执行场景覆盖 Plane/Sketch 的 `FlatFace`、Line 的 `TwoPointLine` 和 Point 的 `Vertex`并锁定引用类型建议、Placement、状态与 `positionBySupport`。源 Box 高度从 6 改为 9 后Vertex Point 的 Z 同步 `6→9`FCStd 关闭重开后保持。反向案例证明 Plane 写入 `Vertex`、Line/Point 写入 `FlatFace` 虽能保留枚举,却都进入 `Touched + Invalid` 并返回 `Attachment mode ... is not implemented.`,且失败状态同样通过 FCStd 往返。新执行/检查命令已进入真实 oracle lane、Sketcher/PartDesign 聚合门禁及 PAR-01 证据。EX-PD-02 仍保持 pending尚需为 50 个实现槽位的全部引用组合构造可执行几何,并完成其他 XLink、重新链接恢复和 Web Chrome 回放。
代表性执行场景覆盖 Plane/Sketch 的 `FlatFace`、Line 的 `TwoPointLine` 和 Point 的 `Vertex`并锁定引用类型建议、Placement、状态与 `positionBySupport`。源 Box 高度从 6 改为 9 后Vertex Point 的 Z 同步 `6→9`FCStd 关闭重开后保持。反向案例证明 Plane 写入 `Vertex`、Line/Point 写入 `FlatFace` 虽能保留枚举,却都进入 `Touched + Invalid` 并返回 `Attachment mode ... is not implemented.`,且失败状态同样通过 FCStd 往返。新执行/检查命令已进入真实 oracle lane、Sketcher/PartDesign 聚合门禁及 PAR-01 证据。本节登记的剩余项已由第 236 节关闭。
## 236. 2026-08-13 EX-PD-02 Attachment/XLink/重连与 Chrome 生命周期闭合
新增 `freecad-attachment-combination-oracle`,不再把 50 个实现模式的注册表元数据当作执行覆盖。锁定 FreeCAD 1.1.1 为 Plane、Sketch、Line、Point 四类对象逐项展开每个 `ImplementedModes` 的全部 `ReferenceCombinations`,形成 `85 + 85 + 44 + 22 = 236` 个执行槽位。每个槽位使用独立 Box、平面、直线、圆、椭圆、双曲线、抛物线、一般曲线和顶点几何初始状态均为 `Up-to-date/Valid``suggestModes` 接受目标模式且 Placement 有限。所有源几何统一平移 `(1.25,-0.75,2)`236 个 Placement 逐轴同步;保存 FCStd、关闭并重开后支持引用、位置、旋转轴和角度均无漂移。`probe:freecad-attachment-combinations` 负责真实执行,`check:freecad-attachment-combinations` 只检查当前报告,两者已纳入真实 oracle lane。
新增 `freecad-xlink-relink-oracle` 覆盖 `App::PropertyXLink``App::PropertyXLinkSub``App::PropertyXLinkList``App::PropertyXLinkSubList`。原生 FreeCAD 要求外链所有者先保存;四类属性标志均为 `21`。源文档关闭或源 FCStd 临时移走时Python 可见链接清空,而 SubShapeBinder 保留最后面积 30 的有效缓存;源文件恢复原路径并重新打开后,四类链接与 Binder 支持自动恢复。恢复后 SourceBox `Length/Width` 与 SecondBox `Height` 编辑通过四类属性传播Binder Face1 面积从 `30→54`;源和消费文档再次保存、关闭、按序重开后仍保持。真实执行与检查命令为 `probe:freecad-xlink-relink``check:freecad-xlink-relink`
Web 新增独立 `ExternalPartDesignLinkRegistry`,按原生状态建模四类外链、`open/closed/missing`、状态标志 `21`、Binder 最后形状缓存、同 document id/同路径重连以及可序列化 undo/redo。真实 Chrome harness 在 COOP/COEP 隔离环境中由 OCCT Worker 创建两代四个 Box以质量属性校验尺寸和面积随后通过 OPFS 保存 missing 状态、重开、重连、编辑、undo/redo、再次保存并验证重开后的历史栈。结束时 OPFS 证据目录删除ShapeHandle 与 kernel reference 均为 `0/0`。执行与静态检查分别为 `test:chrome-partdesign-reference-lifecycle``check:chrome-partdesign-reference-lifecycle`,已进入默认 `verify`、Chrome execute/check lane 和 PartDesign 聚合闭合门。
因此 `PAR-01=completed``EX-PD-02=completed`exact 计划为 `3 completed / 37 in_progress / 12 pending / 0 blocked`。该关闭只对应 Attachment、Datum、Binder、多 Body 与跨文档引用的已定义验收范围;更大的 `EX-PD-01``EX-DOC-04` 仍按各自全 TypeId/全多文档范围保持开放。准确生产命名边界未改变:`availability=unavailable``callbacks=[]``shippedWorkerImplementation=not-linked``freecadNamingBuild.status=contract-only``EX-TSN-02=in_progress``systemExact=false`
## 237. 2026-08-13 EX-TSN-02 生产 FreeCAD 私有命名 Worker 链接闭合
生产 `native/occt-history` 已改为强制读取完整 FreeCAD wasm SDK manifest并把锁定 FreeCAD 1.1.1 的 FreeCADBase、FreeCADApp、Part、Qt/Python 依赖和真实 `ElementMap/MappedName/StringHasher` bridge 链接到 OCCT Worker。默认 `build:occt-history` 必须同时满足 `FREECAD_WASM_NAMING_REQUIRED=1``OCCT_HISTORY_PUBLISH=1`;缺 SDK 或哈希不一致会直接失败。OCCT-only 构建被拆为不发布的 `build:occt-history-only-candidate`,不能覆盖生产路径。
新增共享 19-operation 生产矩阵,覆盖 Fuse/Cut/Common、Rotate、Pad/Pocket、Loft/Pipe、Revolution/Groove、Fillet/Chamfer/Hole/Draft/Thickness 以及 Linear/Polar/Mirrored/MultiTransform。Node 与真实 Chrome 均从已发布生产模块执行实际 OCCT builder history再调用 `freecadNamingAbiVersion``freecadNamingCapabilitiesJson``freecadNamingEvidenceJson`。第 238 节进一步修正了本段最初按结果“取第一条”的错误统计:当前 17 类样本具有至少一个唯一来源并实际执行 C++ 回调Loft/Pipe 为全歧义来源而不调用私有 token 生成;链式 Cut 仍将 StringHasher 扩展到 3 项,缺失 history 继续结构化拒绝。两份报告同时锁定生产 JS/WASM/DATA 和共享 harness SHA-256执行命令与静态 check 分离,旧报告不能替代实时 Chrome。
命名传输现在只保留能解析到外部 `inputId/role` 的历史来源C++ bridge 继续严格拒绝未知来源,不再把内部 builder 形体冒充为外部输入。Node 与 Chrome 报告逐项记录 `externallySourcedRecords/internalRecordsExcluded`Hole 排除 15 条内部圆柱记录LinearPattern、PolarPattern、Mirrored 分别排除内部复制体记录。双输入 Boolean/Loft/Pipe 的独立 tool 输入仍完整保留。相同结果的关系现在先按 provenance 分组:同一来源的重复关系折叠,唯一来源才进入严格 ElementMap多来源保留候选集绝不再依赖数组顺序。
离线资源仍以 `native/occt-history/dist` 为唯一归档源;新增 `publish:occt-history` 在离线恢复后先实例化并校验锁定 ABI再同步 JS/WASM/DATA 到 public。真实 WASM lane 负责重建生产链接并执行 Node 矩阵Chrome lane 自动执行实时生产矩阵并在 check 阶段只读校验报告。
因此当前准确边界为 `availability=available`、三项生产回调齐全、`shippedWorkerImplementation=freecad-linked``freecadNamingBuild.status=production-linked``EX-TSN-02=completed`。本节当时 exact 计划为 `4 completed / 36 in_progress / 12 pending / 0 blocked`;第 238 节已关闭非唯一同构来源任务。`systemExact=false` 保持不变。
## 238. 2026-08-14 EX-TSN-03 同构 provenance 与原生属性缺口量化
生产命名入口不再按 `resultKind/resultIndex` 选择首条历史。新的 provenance 分类器将每个结果按来源对象、来源持久名、来源 stage 和关系分组;只有唯一来源进入 FreeCAD 私有 C++ 命名,多个原生来源则生成 `ambiguous` MappedNameRef 并完整保留候选集。若上游结果已经歧义,下游特征会展开上游候选而不是把中间对象的 `FaceN` 重新稳定化;部分 ElementMap 未覆盖但当前 Shape 合法存在的子形状使用普通 indexed `FaceN/EdgeN/VertexN` 作为输入 fallback不制造私有 token。
Node 与真实 Chrome 的 19-operation 生产矩阵均重跑通过。17 类样本存在唯一来源并执行 C++ 回调Loft 和 Pipe 的当前样本全部为多来源,明确走 ambiguity-only 路径。完全重合的两个等尺寸 Box 做 Common 产生 `26` 个歧义结果,候选数均不少于 2`arrayOrderFallbackUsed=false`。独立 Facade harness 通过真实 `DirectNativeOcctHistoryProvider` 和生产 Worker 验证:对称 Common 为 `26 ambiguous / 156 candidates`,混合 Cut 为 `3 stable + 9 ambiguous`,下游 Rotate 为 `9 stable + 35 ambiguous / 135 candidates`,候选对象仍包含原始 `cut-object``cut-tool`。JSON 持久化保持候选集;已有 Facade 事务测试继续覆盖显式选择、undo/redo 和重算。通用 FCStd `PropertyLinkSub/PropertyLinkSubList` 写出同时改为 fail-closed结构化 TopoRef 必须为 stable、对象一致且是无损原生 `FaceN/EdgeN/VertexN`
原生属性语义新增独立 probe/check。锁定 FreeCAD 1.1.1 的 `Document.supportedTypes` 实跑为 `352` 个注册对象类型、`348` 个可实例化对象、`4` 个明确不可实例化对象,以及 `85` 种属性类型/`5510` 条属性记录。当前原生可编辑 codec 覆盖 `18` 种/`4135`Sketch/Shape/Path/Expression 等专用 codec 覆盖 `5` 种/`683` 条;剩余 `62` 种/`692` 条仍只能 opaque FCStd proxy。观察到 15 类属性状态,其中 Facade 目前只原生表达 Hidden/ReadOnly`2639` 条记录包含其余 13 类状态语义。报告将原始数字位 13、22-27 按锁定 FreeCAD `Property::Status` 映射为 Ordered 与 Prop* 名称,未知数字位为 0。
因此 `EX-TSN-03=completed``EX-TSN-04=in_progress`exact 计划为 `5 completed / 36 in_progress / 11 pending / 0 blocked`。准确边界为 `availability=available`、三项生产回调齐全、`shippedWorkerImplementation=freecad-linked``freecadNamingBuild.status=production-linked``systemExact=false`。剩余系统阻断现为两项:穷尽跨特征命名/原生 FCStd save-reopen-resave 语料以及完整原生文档、属性类型、状态、editor 与生命周期语义。
## 239. 2026-08-14 EX-TSN-04 五阶段生产命名链
同构 provenance harness 已从 Cut→Rotate 扩展为生产 OCCT Worker 实际执行的 Cut→Rotate→Fillet→Mirrored→LinearPattern 五阶段链。每一阶段的 `NativeStageNamingEvidence` 都先经过 JSON 保存/恢复,再作为下一阶段输入;五阶段分别产生 `42/135/261/326/1090` 条原生历史关系stable/ambiguous 映射为 `3+9``9+35``9+35``11+40``55+89`。后四阶段均有 ElementMap2StringHasher 条目单调增长 `0→3→6→9→17`
候选传播门禁不再错误要求每个下游结果永久携带所有祖先对象,而是按当前原生历史实际引用的上游 `kind/sourceIndex` 计算必需候选集合。Rotate、Fillet、Mirrored 和 LinearPattern 所引用的候选对象均完整出现在下游 ambiguity evidence 中;若某阶段没有引用某个祖先歧义子形,则不凭空复制该候选。这一规则同时防止候选丢失和历史污染。
同一 harness 还补充 Web FCStd LinkSub 持久化边界stable、对象一致的 `Face1` 经写入、inspect、rewrite、再 inspect 后仍为 `Face1`ambiguous TopoRef 继续 fail-closed。该证据未执行 FreeCAD 桌面端 save-reopen-resave报告明确记录 `nativeDesktopResaveCovered=false`。因此 `EX-TSN-04=in_progress`、任务计数和 `systemExact=false` 均不变;剩余命名阻断仍是穷尽类型兼容的跨特征转换矩阵,以及完整原生 FreeCAD FCStd 往返语料。
## 240. 2026-08-14 原生复合模型二次 FCStd resave 门
扩展 `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` 均通过。

View File

@@ -5,10 +5,10 @@
## 当前状态
- exact claim`false`
- exact 任务:`1/52 completed``37 in_progress``14 pending``0 blocked`
- exact 任务:`5/52 completed``36 in_progress``11 pending``0 blocked`
- exact 模块:`0/34`
- promotion task`EX-REL-01=pending`
- 三项硬边界:原生 MappedNameRef/StringHasher、逐阶段 builder、无唯一同构来源时 fail-closed
- 三项硬边界:私有 token 只来自原生 MappedNameRef/StringHasher、逐阶段 builder 关系必须有原生证据、无唯一同构来源时 fail-closed
## 实施顺序

View File

@@ -389,17 +389,17 @@ PartDesign Mirrored 已形成 experimental whole-shape 垂直切片Facade 验
运行时命名证据必须来自 native provider 的 `MappedNameRef`/`StringHasher` 或逐阶段 builder capture。`NativeStageNamingEvidence` 对缺失证据写出 `final-shape-only`,对只有原始表而没有可重建回调的 FCStd 资源写出 `opaque-preserved`;两者都不能仅凭最终 Shape 生成新 FreeCAD token。跨阶段 ElementMap2 映射保存 `sourceStageId`、来源集合和 `ambiguous` 候选,校验失败直接阻断写回。
`FreeCADPrivateNamingABI v1` 已定义为版本化 Embind/JSON 合同,并接入 direct provider 与真实 Worker请求携带 operation、输入 STEP、最终 STEP/BRep、阶段 DAG 和原生 history响应必须同时提供 `MappedNameRef`、StringHasher 与 ElementMap2且逐项通过 stage/result 绑定、大小上限、schema、StringID 和引用闭包校验。生产运行时声明 `freecad-private-v1-optional-worker`mock 明确为 `not-exposed`;未导出三项回调、版本/锁定提交不符、证据不闭合或 operation 未声明时均 fail-closed 到 `final-shape-only`,禁止合成 token。当前仓库随附的 `native/occt-history` 仍是 OCCT-only artifact没有链接 FreeCAD 私有实现,因此这里只完成 ABI 与传输边界,不把浏览器实时私有命名提升为 exact。
`FreeCADPrivateNamingABI v1` 已定义为版本化 Embind/JSON 合同,并接入 direct provider 与真实 Worker请求携带 operation、输入 STEP、最终 STEP/BRep、阶段 DAG 和原生 history响应必须同时提供 `MappedNameRef`、StringHasher 与 ElementMap2且逐项通过 stage/result 绑定、大小上限、schema、StringID 和引用闭包校验。生产运行时声明 `freecad-private-v1-optional-worker`mock 明确为 `not-exposed`;未导出三项回调、版本/锁定提交不符、证据不闭合或 operation 未声明时均 fail-closed 到 `final-shape-only`,禁止合成 token。当前仓库随附的 `native/occt-history` 已链接锁定的 FreeCAD 1.1.1 私有命名实现,但该完成只关闭生产 ABI/builder 覆盖,不把系统整体提升为 exact。
ABI 输入现同时携带文档 `objectId`、FCStd 原生正整数 object tag、上一阶段命名证据、明确的 result object/tag 和阶段 DAGobject tag 会从 `Document.xml``Object.id` 导入,按稳定值写回 FCStd并通过 SQLite schema v7、OPFS 重开和 checkpoint 往返。`build:freecad-naming-worker` 是独立的 fail-closed 构建入口只接受锁定提交、Emscripten 3.1.69、wasm Qt/Python、FreeCADBase/FreeCADApp/Part 静态库及三回调 bridge 的哈希清单;普通 `build:occt-history` 继续是 OCCT-only`check:occt-history-artifact` 会实际实例化 WASM 并探测三回调,当前结果为 unavailable因此 `EX-TSN-02=in_progress` `systemExact=false` 保持不变
ABI 输入现同时携带文档 `objectId`、FCStd 原生正整数 object tag、上一阶段命名证据、明确的 result object/tag 和阶段 DAGobject tag 会从 `Document.xml``Object.id` 导入,按稳定值写回 FCStd并通过 SQLite schema v7、OPFS 重开和 checkpoint 往返。命名 ABI 只接收能解析到传输输入 `inputId/role` 的历史来源Hole、Pattern、Mirrored 等 builder 的内部 tool/copy 记录会被明确排除C++ bridge 继续拒绝未知来源,禁止把内部形体冒充为外部 Base。`build:occt-history` 现在是生产 fail-closed 构建入口只接受锁定提交、Emscripten 3.1.69、wasm Qt/Python、FreeCADBase/FreeCADApp/Part 静态库及三回调 bridge 的哈希清单,并发布 JS/WASM/DATAOCCT-only 构建只允许写入不发布的候选目录`check:occt-history-artifact` 会实际实例化 WASM 并探测三回调,Node 与 Chrome 生产矩阵还会逐项执行 19 类 builder。因此 `EX-TSN-02=completed`,而 `systemExact=false` 继续成立
Qt 前置条件已按独立、可离线复现的链路落地:`build:qt6-wasm-core` 使用 Emscripten 3.1.69 构建 QtBase 6.8.2 静态 wasm `Qt6Core`,下载使用 USTC 国内镜像,但必须先通过 Qt 发布包官方 SHA-256离线模式缺包时直接失败不允许回退联网。`build:freecad-naming-source-probe` 进一步锁定 FreeCAD 提交及 `IndexedName.cpp``MappedName.cpp``StringHasher.cpp``MappedElement.cpp``ElementNamingUtils.cpp``ElementMap.cpp``Base/Handle.cpp` 七个原始编译单元的内容哈希,并验证它们能与 wasm Qt6Core 一起生成和执行 wasm32 探针。运行时覆盖名称解析、StringHasher 去重/SHA-1 阈值/索引引用、ElementMap 编码/双向查找/历史/保存恢复以及 MappedElement 稳定排序;真实 ElementMap 保存体和 StringHasher 表还会经过 Web 侧 ElementMap2 parser、引用闭包及严格 `FreeCADPrivateNamingABI` 校验。探针只导出隔离的 `freecadNamingCandidate*` 名称持久化流、Python 包装、类型系统、日志和 Application/Document 生命周期仍由适配头提供FreeCADApp/Part/Python 静态库、真实文档集成、OCCT builder 上下文和生产 bridge 均未链接。因此它证明的是锁定私有源码子集与 ABI 数据可交叉编译/运行,不构成生产命名实现。
`check:freecad-private-naming-boundary` 同时读取 ABI 合同、兼容性矩阵exact 计划,固定校验 `shippedWorkerImplementation=not-linked``freecadNamingBuild.status=contract-only``EX-TSN-02=in_progress``systemExact=false`;该检查已进入默认 `verify`、真实 wasm lane 和离线 smoke。只有生产 OCCT Worker 实际链接锁定的 FreeCAD 私有静态库/bridge且制品探针取得三项回调和完整命名证据后才能在后续批次修改这些状态。
`check:freecad-private-naming-boundary` 同时读取 ABI 合同、兼容性矩阵exact 计划及 Node/Chrome 生产报告,固定校验 `shippedWorkerImplementation=freecad-linked``freecadNamingBuild.status=production-linked``EX-TSN-02=completed``systemExact=false`。检查还要求三项回调、19 类 builder、链式 StringHasher、缺历史 fail-closed 及 JS/WASM/DATA/harness 哈希同时成立;该检查已进入默认 `verify`、真实 wasm lane和离线 smoke。
生产 SDK 前置已有完整候选闭包。七个锁定命名编译单元仍保留 `libFreeCADPrivateNamingProbe.a` 作为源码先决条件;实际 bridge 则链接真实 FreeCADBase/FreeCADApp/Part、QtCore、CPython 及 21 个传递依赖,并初始化真实 `App::Application``check:freecad-naming-sdk-readiness` 解析所有静态 `ar` 成员并拒绝宿主 ELF`generate:freecad-naming-sdk-manifest` 还锁定 C++20、pthread、兼容头、host adapter 和预加载的 Python wasm stdlib。完整 `check:freecad-naming-sdk` 对库、源码和运行时文件逐项复算 SHA-256。
隔离 bridge 的 Node 烟测已用真实 `ElementMap/MappedName/StringHasher` 生成首阶段和链式证据,并验证 `$#id:index` 与 StringHasher 闭包。独立 pthread OCCT 候选模块进一步在 Node 和真实 Chrome 中执行 OCCT cut history,再从同一 wasm 调用三项 FreeCAD 私有命名回调Chrome 执行与报告检查分开,检查器会拒绝与当前 JS/WASM/DATA 哈希不一致的旧报告。该候选强制写入 `.cache/candidates``OCCT_HISTORY_PUBLISH=0`,没有替换仓库随附生产 Worker。因此候选 SDK/Worker 验证完成不等于生产链接完成`shippedWorkerImplementation=not-linked``EX-TSN-02=in_progress``systemExact=false` 仍保持不变
隔离 bridge 的 Node 烟测已用真实 `ElementMap/MappedName/StringHasher` 生成首阶段和链式证据,并验证 `$#id:index` 与 StringHasher 闭包。独立 pthread OCCT 候选仍保留为不发布的前置门;生产 Worker 则在 Node 和真实 Chrome 中对同一共享矩阵执行 19 类 OCCT builder,再从同一 wasm 调用三项 FreeCAD 私有命名回调Chrome 执行与报告检查分开,检查器会拒绝与当前 JS/WASM/DATA 或共享 harness 哈希不一致的旧报告。生产链接完成;剩余 exact 阻断为同构来源唯一性、完整跨特征/FCStd 往返和完整文档/属性语义
Sketcher/PartDesign 的 Web 支持范围新增可执行参数合同Sketcher 覆盖 FreeCAD 1.1.1 FCStd 表面的 9 类 geometry、19 类 constraint 和 10 类 InternalAlignment 语义PartDesign 覆盖 Facade 已支持的 21 个 family、202 个属性槽和 72 个语义分区,并在对象创建及属性编辑时执行跨字段校验。`check:freecad-sketcher-partdesign-abi` 会从实现重算这些计数并拒绝陈旧报告;该“完整”限定于 supported Web Facade不包含尚未实现的 FreeCAD PartDesign TypeId也不表示 basic TypeScript solver 已求解全部圆锥曲线约束。
@@ -409,7 +409,7 @@ Sketcher/PartDesign 的 Web 支持范围新增可执行参数合同Sketcher
全功能对标不再沿用已经 `83/83 completed` 的 compatible 发布 WBS 作为完成判据。`config/freecad-web-exact-parity-plan.json` 建立 EX01..EX10、52 项 exact 任务,覆盖 34 模块、15 格式、6 入口,详细依赖和验收见 `docs/freecad-full-parity-execution-wbs.zh-CN.md` 第 20 节。优先顺序为原生 oracle -> kernel/history/naming -> document/property -> Sketcher/Part/PartDesign -> FCStd/formats -> GUI -> 生产/工程/平台工作台 -> 跨浏览器质量 -> exact 签名发布。
`check:freecad-web-exact-parity-plan` 与旧 execution-plan gate 一起进入默认 verify。开放任务必须保留 `exactBlockedBy`,完成任务必须具有已登记的可执行 evidence 且不能继续带阻断项34 模块和 21 个格式/入口必须逐项映射到任务。最终 `EX-REL-01` 只有在所有任务完成、34 模块均为 exact、八项零差异指标成立时才允许关闭。当前状态为 `1/52 completed`,系统仍为 `exact=false`
`check:freecad-web-exact-parity-plan` 与旧 execution-plan gate 一起进入默认 verify。开放任务必须保留 `exactBlockedBy`,完成任务必须具有已登记的可执行 evidence 且不能继续带阻断项34 模块和 21 个格式/入口必须逐项映射到任务。最终 `EX-REL-01` 只有在所有任务完成、34 模块均为 exact、八项零差异指标成立时才允许关闭。计划建立时基线为 `1/52 completed`;截至第 23 节已推进为 `3/52 completed`,系统仍为 `exact=false`
`check:freecad-web-exact-promotion` 进一步阻止直接编辑 `claim.exact` 或能力矩阵来“提升”版本:在 `exact=false` 状态只输出 fail-closed只有 `EX-REL-01` 完成并提交结构化 promotion report报告同时满足 52/52、34/34、八项指标全零和八类证据才允许 promotion gate 通过。
@@ -417,6 +417,14 @@ Sketcher/PartDesign 的 Web 支持范围新增可执行参数合同Sketcher
### 22. 参数 mutation 与阶段命名证据闭合规则2026-08-10
EX-ORA-02 的 mutation corpus 由 `config/freecad-parameter-mutation-plan.json` 定义为五项独立证据nominal 参数、非法边界、两个以上显式参数快照、真实编辑-重算-恢复事务,以及无差异 FCStd 往返。`config/freecad-parameter-mutation-report.json` 必须由现有黄金证据生成,`check:freecad-parameter-mutations` 会逐字节重算并拒绝陈旧或手工提升的报告。当前只有 `1/35` family 完整,因此 EX-ORA-02 保持 `in_progress`
EX-ORA-02 的 mutation corpus 由 `config/freecad-parameter-mutation-plan.json` 定义为五项独立证据nominal 参数、非法边界、两个以上显式参数快照、真实编辑-重算-恢复事务,以及无差异 FCStd 往返。`config/freecad-parameter-mutation-report.json` 必须由现有黄金证据生成,`check:freecad-parameter-mutations` 会逐字节重算并拒绝陈旧或手工提升的报告。该矩阵建立时只有 `1/35` family 完整,当前已为 `35/35`EX-ORA-02 仍因逐 family 原生 Shape/history/ElementMap2/StringHasher 和未知语义差异的更大验收范围保持 `in_progress`
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。
### 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`,不会因本批完整执行覆盖而被误判为实现。
跨文档 corpus 同时覆盖 `PropertyXLink``PropertyXLinkSub``PropertyXLinkList``PropertyXLinkSubList` 和 SubShapeBinder。源关闭与源文件缺失时链接值清空、Binder 保留最后有效 Shape恢复原文档 ID/路径后自动重连,后续参数编辑和再次 FCStd 往返继续传播。Web Chrome 以真实 OCCT Shape、OPFS、undo/redo 和最终 `0/0` ownership 回放同一生命周期,执行命令与静态报告检查分离。
该完成不解除更大范围任务:`EX-PD-01` 仍需完整注册 PartDesign TypeId 与参数交叉积,`EX-DOC-04` 仍需全应用多文档/merge/conflict/crash recovery生产 Worker 命名链接已由 `EX-TSN-02` 关闭,同构 provenance 已由 `EX-TSN-03` 关闭。系统维持 `exact=false`,当前 exact 计划计数为 `5 completed / 36 in_progress / 11 pending / 0 blocked`