feat: complete production naming and reference lifecycle gates
This commit is contained in:
@@ -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`。后四阶段均有 ElementMap2,StringHasher 条目单调增长 `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` 均通过。
|
||||
|
||||
Reference in New Issue
Block a user