feat: add candidate FreeCAD naming SDK and attachment oracles
Build and verify the candidate-only FreeCAD naming bridge and OCCT worker path, including three-stage StringHasher restoration. Add Datum, ShapeBinder, attachment-mode, and PartDesign structure oracles plus offline SDK build plans and CI boundary checks.
This commit is contained in:
@@ -629,7 +629,7 @@ FCStd writer 现在把 Web Sketch 的 `Support`、`MapMode`、`AttachmentOffset`
|
||||
|
||||
锁定 FreeCAD 1.1.1 已实际打开、重算并另存 Web 生成的 `ExternalBox + Sketch`:`MapMode=FlatFace`、`AttachmentSupport=ExternalBox.Face1`、AttachmentOffset Z=0.25 mm,同时保留 10 个内部几何、11 个约束、1 个外部 Edge1 投影和外部 `PointOnObject` 约束。回存 FCStd 由 Web inspector 解码原生字段,并从隐藏元数据精确恢复 Face1 的 topologyVersion=3、generation=2 和 signature。Facade 回归升至 140/140,桌面 oracle 与生产构建通过。
|
||||
|
||||
该增量关闭当前六种 Web Attachment 模式的 FCStd 边界证据,不宣称完整 FreeCAD AttachEngine 的 56 种模式、多引用 ThreePoints/Intersection 支撑、MapReversed/MapPathParameter 或局部 Attachment 几何执行全部等价。FC-06 仍受 Face 多投影、高级 Sketch 约束和批量 FCStd 黄金约束,83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。
|
||||
该增量关闭当前六种 Web Attachment 模式的 FCStd 边界证据,不宣称完整 FreeCAD AttachEngine 的 55 种持久化模式、多引用 ThreePoints/Intersection 支撑、MapReversed/MapPathParameter 或局部 Attachment 几何执行全部等价。FC-06 仍受 Face 多投影、高级 Sketch 约束和批量 FCStd 黄金约束,83 项计划计数保持 30 completed、21 in_progress、32 pending、0 blocked。
|
||||
|
||||
## 82. 2026-08-04 FC-06 Sketcher SnellsLaw/Weight 原生往返增量
|
||||
|
||||
@@ -1790,6 +1790,52 @@ Sketcher 数据模型和 FCStd codec 已覆盖 FreeCAD 1.1.1 的完整原生几
|
||||
|
||||
QtBase 6.8.2 源码包已通过 USTC 国内镜像取得,并用 Qt 发布包官方 SHA-256 `012043ce6d411e6e8a91fdc4e05e6bedcfa10fcb1347d3c33908f7fdd10dfe05` 校验。新增 `build:qt6-wasm-core`,固定 Emscripten 3.1.69,构建静态 wasm32 `Qt6Core`、bundled Pcre2 和 zlib;离线模式只使用本机缓存,缺少已校验源码包时立即失败。源码包、展开源码、可用 SDK 和可选增量构建目录均已纳入项目离线资源清单。
|
||||
|
||||
新增的 `build:freecad-naming-source-probe` 并未假装提供生产命名实现。它固定 FreeCAD 1.1.1 提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`,同时校验 `IndexedName.cpp` 与 `MappedName.cpp` 的逐文件 SHA-256,再把这两个原始编译单元与 wasm Qt6Core 编译为独立探针。运行时验证 IndexedName 解析、MappedName 追加和 tag 读取;探针明确检查不导出 `freecadNamingAbiVersion`、`freecadNamingCapabilitiesJson`、`freecadNamingEvidenceJson`。这证明的是锁定基础源码与工具链可交叉编译,不包含完整 StringHasher、FreeCADApp/Part 静态库或生产 Worker bridge。
|
||||
新增的 `build:freecad-naming-source-probe` 并未假装提供生产命名实现。它固定 FreeCAD 1.1.1 提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`,同时校验 `IndexedName.cpp`、`MappedName.cpp`、`StringHasher.cpp` 与 `Base/Handle.cpp` 的逐文件 SHA-256,再把四个原始编译单元与 wasm Qt6Core 编译为独立探针。运行时验证 IndexedName 解析、MappedName 追加/tag 读取、StringHasher 去重、SHA-1 阈值及索引映射名称引用;探针明确检查不导出 `freecadNamingAbiVersion`、`freecadNamingCapabilitiesJson`、`freecadNamingEvidenceJson`。这证明的是锁定 StringHasher 核心源码与工具链可交叉编译和运行,不包含 `ElementMap.cpp`、`MappedElement.cpp`、FreeCADApp/Part 静态库或生产 Worker bridge。
|
||||
|
||||
新增 `check:freecad-private-naming-boundary`,跨 ABI 合同、兼容性矩阵和 exact 计划校验同一状态,并接入默认 `verify`、真实 wasm lane 和离线 smoke。准确边界保持不变:随附 OCCT Worker 仍没有链接 FreeCAD 私有 C++ 命名实现,制品仍无三项私有命名回调;`shippedWorkerImplementation=not-linked`、`freecadNamingBuild.status=contract-only`、`EX-TSN-02=in_progress`、`systemExact=false`。本批只完成可离线复现的前置构建和防止状态误提升的机器门禁。
|
||||
|
||||
## 231. 2026-08-12 ElementMap 原始源码 WASM 探针与隔离 ABI 候选
|
||||
|
||||
私有命名源码探针现已锁定并直接编译 FreeCAD 1.1.1 的 `IndexedName.cpp`、`MappedName.cpp`、`StringHasher.cpp`、`MappedElement.cpp`、`ElementNamingUtils.cpp`、`ElementMap.cpp` 与 `Base/Handle.cpp` 七个原始编译单元。独立 WASM 实跑覆盖 StringHasher 去重/SHA-1 阈值/索引引用、ElementMap StringHasher 编码、双向查找、历史回溯、保存恢复、MappedElement 排序和 DocumentObject tag;Application/Document 生命周期、持久化流、Python 包装、类型系统和日志只在探针中使用最小宿主适配。
|
||||
|
||||
探针现在从真实 `ElementMap::save` 和 `StringHasher::getIDMap` 生成原生资源。ElementMap 保存体按 FreeCAD `ComplexGeoData` 外层协议补入 `BeginElementMap v1` 后,由 Web `parseElementMap2` 读得 `MapCount=1`、4 个名称和 1 个 token;StringHasher schema v2 读得 1 个条目,引用闭包无缺失。三个刻意隔离命名的 `freecadNamingCandidate*` 回调把这些资源送入现有 `probeFreeCadPrivateNamingAbi` 与 `captureFreeCadPrivateNamingEvidence`,严格 Web ABI 校验通过。候选只接受探针 `cut` 协议载荷,没有 OCCT builder context,也不会发布到生产 Worker。
|
||||
|
||||
`config/freecad-private-naming-source-readiness.json` 与 `check:freecad-private-naming-boundary` 已把真实源码、运行时断言、宿主适配、隔离候选和生产缺口分别建模;检查器拒绝候选使用生产回调名,并继续要求生产导出列表为空。真实 WASM lane 与离线 smoke 都会重建和执行源码探针及候选 ABI 测试,不允许只读取历史结果。
|
||||
|
||||
准确边界保持不变:`native/occt-history` 生产制品未链接探针,也未链接 FreeCADApp/Part/Python 静态库、真实 Application/Document 集成或生产 bridge,三项生产 Embind 命名回调仍不存在。因此 `shippedWorkerImplementation=not-linked`、`freecadNamingBuild.status=contract-only`、`EX-TSN-02=in_progress`、`systemExact=false` 全部保持不变。下一步是生成可审计的 wasm FreeCADApp/Part/Python 静态 SDK,将真实 OCCT builder 阶段历史接入生产 bridge,再对每类 builder 执行命名证据和 FCStd 往返门禁。
|
||||
|
||||
## 232. 2026-08-12 FreeCAD 命名 WASM SDK 差距门与静态归档形态
|
||||
|
||||
七个已锁定的 FreeCAD 私有命名编译单元不再直接混入探针最终链接命令,而是分别生成 wasm object,再由 `emar` 封装为隔离的 `libFreeCADPrivateNamingProbe.a`。烟测解析真实 `ar` 成员并确认归档为 900882 bytes、7 个成员、7 个 wasm object、0 个 LLVM bitcode;主探针只从该归档解析命名符号后,StringHasher、ElementMap、MappedNameRef 与 Web ABI 全部断言继续通过。该归档仍使用 Persistence/Python/Application/Document 等宿主适配,机器清单固定 `hostAdapterBound=true`、`productionEligible=false`,不冒充 FreeCADBase/FreeCADApp。
|
||||
|
||||
新增 `config/freecad-naming-sdk-plan.json`、`check:freecad-naming-sdk-readiness` 和 `generate:freecad-naming-sdk-manifest`。就绪检查直接解析静态 `ar`,接受 wasm relocatable object/LLVM bitcode,明确拒绝宿主 ELF;当前本机验证 `libQt6Core.a` 为 219 个 wasm object,并验证其 Bundled Pcre2 27 个、Bundled Zlib 15 个实际链接依赖。FreeCAD 私有头与 QtCore 头齐全,但核心五库仅 `QtCore=1/5`,仍缺 FreeCADBase、FreeCADApp、Part、Python 和 production bridge。生成器在任何缺项下都拒绝写 manifest,完整 SDK 检查也复用相同归档目标校验,不允许仅靠文件非空和 SHA-256 混入 x86 库。
|
||||
|
||||
readiness 已进入默认 `verify`、真实 WASM 重建 lane 与离线 smoke;候选 SDK 目录要等首个真实 FreeCADBase/Python wasm 归档生成后再加入离线资源库,当前不制造空资源记录。准确边界不变:生产 OCCT Worker 未使用上述探针归档,`availability=unavailable`、`callbacks=[]`;`freecadNamingBuild.status=contract-only`、`EX-TSN-02=in_progress`、`systemExact=false`。下一步仍是获取或构建锁定 Emscripten 3.1.69 的 FreeCADBase/FreeCADApp/Part/Python 静态库,实现真实 Document/OCCT builder bridge 后再做 production artifact probe。
|
||||
|
||||
## 233. 2026-08-13 完整候选 SDK、真实私有命名桥与隔离 Worker
|
||||
|
||||
候选 SDK 已从差距门推进为完整可校验闭包。FreeCADBase、FreeCADApp、Part、QtCore 和 CPython 3.13 五个核心 wasm 静态库全部通过 `ar` 成员目标检查;21 个链接依赖包含 Qt/ICU/Xerces/Boost/yaml-cpp 以及 CPython 实际拉入的 mpdecimal、expat、HACL SHA2、zlib、bzip2、sqlite3。CPython 构建固定 `SOURCE_DATE_EPOCH`,显式生成 `pybuilddir.txt` 和 wasm stdlib;连续两次构建得到相同的 `libpython3.13.a` 与 `python313.zip` 哈希。manifest 现在同时哈希 bridge、host adapter、force-include 头和 Python 运行时文件,并固定 C++20、pthread 和四项兼容宏,缺任一项都拒绝生成或加载。
|
||||
|
||||
新增真实隔离 bridge,不再依赖探针 shims。它初始化 FreeCAD `App::Application`,直接调用锁定 1.1.1 的 `ElementMap::encodeElementName/setElementName/beforeSave/save`、`MappedName` 和 `StringHasher`,导出三项版本化 ABI。Node 实跑验证首阶段 postfix、链式 `$#id:index`/3 项 StringHasher 闭包,以及缺 history 的结构化 fail-closed;JS/WASM/DATA 的哈希证据写入本机候选报告,且明确 `productionPublication=false`。
|
||||
|
||||
SDK-05 又建立了独立 pthread OCCT 构建和 `.cache/candidates/freecad-naming-worker` 候选模块。Node 与 Chrome 均在同一个 wasm 中先执行 OCCT 8.0.0 cut history,再调用 FreeCAD 私有命名 ABI;Chrome 在 COOP/COEP 隔离环境中验证三回调、链式 StringHasher 闭包和无 history 拒绝。执行命令与只读报告检查已拆分,检查器会重新计算当前 JS/WASM/DATA 哈希,静态旧报告不能替代真实 harness。本批 WBS 为 SDK-01/02A/02B/03/04/05 completed,PAR-01 in_progress。
|
||||
|
||||
候选桥随后补齐非空 StringHasher 的下一阶段恢复。它只接受 schema/nativeVersion 正确、ID 连续有序、依赖只指向既有 ID、能够由 FreeCAD 公共 `StringHasher` API 逐字段重建的表;二进制/单向哈希、缺表、ID 篡改和多输入不一致表继续 fail-closed。隔离桥、合并 Worker 和真实 Chrome 都执行三阶段链,条目数为 `0→3→5`;隔离负例确认篡改 ID 与不一致表均被拒绝。该能力仍仅存在于候选目录,未发布到生产 Worker。
|
||||
|
||||
准确生产边界没有改变:候选构建强制 `OCCT_HISTORY_PUBLISH=0`,没有覆盖仓库随附的 `native/occt-history` 或 `public/native/occt-history`。因此生产 `availability=unavailable`、`callbacks=[]`、`shippedWorkerImplementation=not-linked`、`freecadNamingBuild.status=contract-only`、`EX-TSN-02=in_progress`、`systemExact=false` 继续成立。下一项是 PAR-01:扩展 Datum/Attachment/ShapeBinder、多 Body、完整参数 mutation/编辑恢复/FCStd 往返,并在覆盖每类 builder 后才评估生产发布。
|
||||
|
||||
## 234. 2026-08-13 PAR-01 首批 Datum/Binder/多 Body 原生结构 oracle
|
||||
|
||||
新增 `freecad-partdesign-structure-oracle`,直接在锁定 FreeCAD 1.1.1 中创建四个 Body、Plane/Line/Point 三类 Datum、ShapeBinder 与 SubShapeBinder。初始证据锁定 SourceBody.Tip=SourceBox,而只包含 Datum 或 Binder 的三个 Body.Tip 均为 null;这些非实体对象不会错误接管 Tip。DatumPlane 使用 XY_Plane/FlatFace 与 Z=5、绕 Z 30° 的 AttachmentOffset,DatumLine/Point 分别使用 ObjectX/ObjectOrigin;四个 Body 的 Group 顺序均被采集。
|
||||
|
||||
源 AdditiveBox 的 Length 编辑使体积 `480→672`,跨 Body ShapeBinder 同步 `480→672`;选定 Edge1..4 的 SubShapeBinder 长度保持 28。DatumPlane offset 编辑为 Z=7/45° 后,其实际 Placement 同步更新。另建 `Face999` 支撑的 DatumPlane,FreeCAD 明确返回 `Touched + Invalid` 与 `AttachEngine3D: subshape not found SourceBox.Face999`,没有把坏引用静默重绑。
|
||||
|
||||
该文档真实保存为 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 生命周期尚未闭合。
|
||||
|
||||
## 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 回放。
|
||||
|
||||
Reference in New Issue
Block a user