跳转到内容

Aira 开源底座与自研实现重叠审计:OCAF 与其他库的复用边界

主文档与完整目录。本分篇保留原调查日期的依据与实测记录;其中的当前状态、建议和授权仅属于历史快照,不是执行队列。

4. OCCT/OCAF:重叠必须落实到可替换的实现

Section titled “4. OCCT/OCAF:重叠必须落实到可替换的实现”

4.1 拓扑索引与邻接:应优先复用,不能继续默认手写

Section titled “4.1 拓扑索引与邻接:应优先复用,不能继续默认手写”

Exact edge graph有两处基础成本:

  • enumerateUniqueSubShapes 第 472 行用 unique.some(IsSame) 去重,比较次数最坏为二次量级。
  • incidentFaceRecords 第 336 行对每条边遍历所有面,再创建各面的 edge explorer;设所有面的 edge occurrence 总数为 H,E 条边会重复访问约 E×H 个 occurrence,并产生大量跨 WASM 调用。

相同 OCCT 版本的 TopExp::MapShapes、MapShapesAndUniqueAncestors 和 TopTools_ShapeMapHasher 已提供对应索引。Hasher 的相等比较就是 IsSame,这里不是只能用自研 hash 才能保持所需等价关系。TopExp 源码、 Hasher。

建议:增加薄的 native 批量 helper,单次求值建立 topology index 和 adjacency,再映射到 Aira ID。 保留周期 seam、退化边、非流形和选择域检查;不能误把 occurrence 数当不同面数,也不能把内部 map 索引持久化成公共 SemanticRef。已有 seam 修正不应回退。

确认存在算法结构上的冗余与成熟替代,尚未实测替换提速。 当前 58-binding manifest 没有暴露这些 map 设施,需要补绑定;“JS 当前没有”不等于“OCCT 没有”。高层 Replicad 的去重代码也使用线性 some(IsSame),所以只改为调用高层库并非这项优化的充分方案。

4.2 通用 history:原生 BRepTools_History 比散落的 collector 更值得复用

Section titled “4.2 通用 history:原生 BRepTools_History 比散落的 collector 更值得复用”

Fillet/Chamfer/Shell/Difference 分别维护输出 face 搜索、Generated/Modified/IsDeleted 消费、 集合合并和资源释放。Fillet/Chamfer 的 collector 结构尤其接近。 来源:Fillet、 Chamfer、 Shell。

OCCT 已有 BRepTools_History: 统一 Generated/Modified/Removed 关系,支持从算法 history 收集及组合两段 history。 当前绑定清单未直接暴露它。

建议先比较“原生统一 history + Aira origin 映射”与现有多份 collector,而不是每新增一种 operation 再复制一份。它可替换底层关系收集/合并,不能自动生成 Aira 的设计角色、来源语义和外部契约; 不同 maker 的 history 覆盖差异仍需如实处理,未证明所有 collector 可以删除。

4.3 TNaming:与我们的引用恢复有实质重叠,不只是一个可借鉴概念

Section titled “4.3 TNaming:与我们的引用恢复有实质重叠,不只是一个可借鉴概念”

TNaming_Selector 提供 context-aware Select、Arguments 和按更新状态 Solve; TNaming_Builder 负责登记拓扑演化。与 Aira 的选定面/边、依赖关系、修改后追踪具有实质重叠。

目前 Aira 用原生 history 加自有 lineage,再建立 ArtifactGraph/SemanticRef;选取时还会重新序列化 face/edge、hash 并找回 native shape。仅一层索引映射可能就能减少重复观测,不必先替换所有命名。 来源:ArtifactGraph 的观测与反查、 Edge 观测与反查。

需要严格比较 TNaming 对真实连续编辑的帮助,而不能预设自研更好。比较对象至少包括唯一恢复、 split/merge、删除和歧义,不只比较正常盒子案例。外部 SemanticRef 可以映射内部 TNaming, “公共 ID 不能等于 OCAF label”不是拒绝复用的理由。

但 TNaming 依赖正确的算法 history、模型组织与选择记录,不能保证任意变化后自动恢复设计意图。 本轮确认重叠和当前未采用,没有测出谁的恢复成功率更高。 OCAF 官方指南。

4.4 TFunction 与重建:现有产品缺口不能被架构文档掩盖

Section titled “4.4 TFunction 与重建:现有产品缺口不能被架构文档掩盖”

TFunction_Driver 提供 MustExecute、Validate、Arguments/Results 与应用实现的 Execute, 配合 GraphNode/Iterator/Logbook 组织依赖和更新。 来源:Driver。

当前 Exact DAG明确执行 full rebuild, 并只接受 Revision 来源;此前自研的增量 QueryEngine 曾验证 dirty propagation/cache/early cutoff,但从未接入这条 Exact 图路径,现已作为无产品消费者的隔离实验退役到不可变证据归档。 不能把“曾证明一个增量框架”写成“工业工作台已经增量更新”。

这里既有与开源的重叠,也有内部成果尚未复用的问题。TFunction 并非无需应用代码的完整建模系统; 旧 QueryEngine 的缓存也不能直接保管跨 Worker 原生句柄。需要比较单一执行所有者和真实依赖, 不要再加第三套调度器。本轮未得出应立刻用 TFunction 替换整个跨表示 Query Engine 的结论。

4.5 OCAF 文档、事务、持久化:不全该自研,也不是整套现成替换

Section titled “4.5 OCAF 文档、事务、持久化:不全该自研,也不是整套现成替换”

TDocStd_Document 具有 NewCommand/CommitCommand/AbortCommand/Undo/Redo;OCAF 还提供属性与文件持久化驱动。 Aira 的事务 Core、项目存储 承担了其中部分同类责任,同时处理 Candidate、验证令牌、分支 CAS 和追加式 Revision。

两点必须同时承认:OCAF 已有相当多基础能力;Aira 的外部事务语义也不等同一个 native document command。不能仅用同名功能证明可替换,也不能用语义不同证明内部局部事务永远不能复用。

浏览器存储层另有更直接的收敛点:repository多处 getAll() 后按项目过滤,当前建库没有相应二级索引;随多项目/长历史增长会读取无关数据。 这是应使用 IndexedDB 现成索引的实现缺口,而非需要 OCAF 才能解决。idb 可减少 Promise 包装, 但不会自动实现 Aira 的 CAS、分支可见性和备份语义。idb 官方。

5. 其他库:具体重叠与薄层的举证责任

Section titled “5. 其他库:具体重叠与薄层的举证责任”
领域 上游已经提供 / Aira 实际使用 应采取的判断
Exact 几何算法、测量与有效性 已调用 BRepPrimAPI、BRepAlgoAPI、BRepFilletAPI、MakeThickSolid、BRepCheck、BRepGProp、BRepBndLib 不是重写内核;重复 wrapper/遍历可收敛
网格提取与 Face groups Replicad 的 ReplicadMeshExtractor 批量返回 vertices/normals/triangles/faceGroups;Aira 多处逐点/三角形调用 Embind 直接对比批量提取,保留 provenance/容差元数据;不是无条件换掉转换证据
原生资源管理 Replicad 有 WrappingObj/localGC,Aira 多处手写 own/dispose/finally 需要统一显式所有权;FinalizationRegistry 不能代替及时释放,不能盲换
草图高层封装 PlaneGCS npm 还有 GcsWrapper、SketchIndex、primitive→参数映射和诊断 当前直接 GcsSystem 再写类似适配;对比是否能保留 Aira 单位/ID/残差而减薄映射
Manifold 布尔/来源 现有 Mesh 路径已消费 runOriginalID/faceID;不是完全自写 Mesh history 保留既有复用,别重复计算成债务
Mesh 焊接 Manifold 有 Mesh.merge()、merge vectors,Aira Exact 转换自行网格吸附 接受域不同:上游是 best effort,不能当作恒成功或无损替换;先修量化误差
Field 网格提取 Standard 路径实际调用 Manifold.levelSet;自写 buffer 拓扑检查/残差 检查输出传输和数值失真有价值;不是另写一遍 mesher,也不是完整独立几何证明
Field 表达式求值 Aira 自写 typed Field evaluator;Fidget 提供 tape/interval/gradient/meshing 等 存在候选重叠,但 Fidget 不是已用产品库;数值域、单位和 certified contract 尚无等价对照
Three.js 显示/拾取 已使用 BufferGeometry、BufferAttribute、Raycaster、bounding volumes 不是自写 renderer;RenderPacket→SemanticRef 的映射并非 Three.js 内置
JSON/schema/hash Rust 已调用 serde_jcs/jsonschema,TS 严格扫描与 NFC/JCS 投影补项目输入条件 不删独立严格边界;Ajv 不会恢复 JSON.parse 已丢掉的重复 key
3MF 包装 自写 ZIP/CRC/XML 与读取检查 缺少差异化且已复现检查盲区,优先成熟 ZIP + 独立 3MF reader 对照

具体来源:

  • Replicad mesh 实现、 资源管理。 本轮实例化的 npm OCCT baseline 确实暴露 ReplicadMeshExtractor,但不暴露 TopExp map、 BRepTools_History、TNaming、TFunction;只出现 TDocStd_Document 不等于完整 OCAF 已可用。
  • PlaneGCS 高层 wrapper、 官方仓库。高层模型覆盖范围更大不等于当前 Aira 未开放的 椭圆/样条是算法缺陷;应区分产品子集与无必要的低层重复。
  • Aira Mesh provenance(apps/web/src/geometry/artifact-graph.ts,本轮审计时的 Web 侧 MeshSolid 溯源实现;工作台转为纯 exact 路径后该文件已无调用方,于 2026-09-07 随死代码清理删除。 本条结论按当时代码成立,不改写;exact 路径的对应实现见 exact-artifact-graph)、 Manifold API、 安装包类型定义。
  • Field runtime、 Fidget 官方。Lane R 的证书前提不能以一般 mesher 成功替代。
  • Three.js adapter、 TS canonical 输入、 严格 JSON 扫描、 Rust canonical。

显示层核查使用了 threejs-geometry skill 确认 BufferGeometry、属性、边线与资源释放的职责。 没有据此修改 Three.js 渲染或把 mesh 工具替代 Exact CAD。

5.1 扩查发现:不要把已有复用、实验和产品混为一谈

Section titled “5.1 扩查发现:不要把已有复用、实验和产品混为一谈”
  • Evals 并未重写 Inspect/Harbor。 Inspect adapter 实际使用 Task/solver/scorer,Aira 提供任务、Core adapter 和领域评分; Harbor 配置检查(packages/aira-evals/tests/test_harbor_task.py)消费上游 Task/separate verifier, 不是自写容器编排。CADTestBench bridge 明说本地进程只适用于可信 fixture,不能当作恶意代码隔离。本轮没有执行其中代码或容器。
  • 检索却仍有三套不同机制,评测不等于产品。 Python retrieval 自写 BM25,旧 Web Interface 关键词打分,共享 Exact Interface 用 substring 次数。Exact 把纯中文 query 分词为空后返回全目录截断;Python 也只保留 [a-z0-9]。因此不能拿英语小样本 BM25 得分 当作产品多语言检索的验证。BM25 数值实现可以对照 BM25S, Aira 保留任务充分性/拒绝语义;产品评测应调用实际 catalog.search。尚未选择替代版本,分词、 同义词、空查询和排序规则仍需明确,换库不会自动达到 100% 检索。
  • 共享层已经有,不能又写一套。 operation Worker client、 Exact Session、 Exact Interface已经共享, Shell/Chamfer 接口与 client 有薄配置入口。Field spike 多个同名文件实际只 re-export lane-r; 不能按文件名重复就声称维护了两套算法。另一方面,这些共享层确有 §3 的缺陷,统一后仍要审查。
  • 两条 Session 的失败恢复不一致,需要收敛所有权。 Exact Session 在 Core commit 后调用 persistCommit,失败不在该入口恢复内存 head;UI coordinator 会走恢复路径,但直接 Interface 只返回错误。较早的 versioned Session第 499–518 行 已在持久化失败时恢复。建议共享“持久化失败恢复 / 已持久化但重建失败”的结果语义,而不是 每个调用者补偿。源码确认,未做真实 IndexedDB 配额/CAS 故障注入,不宣称磁盘已丢数据。
  • Query cache 也只是候选底座,不能因已验收实验就无条件产品化。 当前 create 检查重复 ID 和 缺失依赖,但未拒绝 cycle;evaluate 的 memo 只在完成后填充,循环依赖没有 visiting guard。 API 接受任意 definitions 时需有 DAG 前置保证。缓存淘汰反复汇总全 Map、排序找最旧项,未实测 大规模收益;应对照成熟图/缓存设施或已有受验证 compiler,不借“增量引擎”再扩建全能框架。
  • Lane R 的底层算术也需审计,但普通 mesher 不等价。 已调用 robust(谓词 spike)和 mathlib(formal);Lane R 自有 nextUp/nextDown、区间运算、BigInt 有理根,Field 两版本还各有 decimal 算术。可复用算术须满足向外舍入/精确性/输入域,不是换任意 decimal 库就得到证明。 生产 production-common当前只接受单 sphere, 不代表通用 Field 已有同位保证。此处仅完成边界盘点,未证明自写数值实现全部正确或优于开源。
  • 脚本不是另造 SHA 或测试框架。 共享 evidence helpers 调 Node crypto/git,tier runner 调 现有 pnpm/cargo/测试命令。领域证据绑定不等同一般 task runner,但也不证明全部脚本必要; 本轮只核对调用边界,不推翻 GC-1~GC-6,也不把修脚本变成 CAD 开工前置工程。

网关核对使用 workers-best-practices 的读取/限长/配置规则,已查当前官方文档和本地 Wrangler schema; 最新类型远程获取失败,回退实际安装 @cloudflare/workers-types@5.20260901.1。 tsc -p tsconfig.worker.json --noEmit 通过,不证明 §3.9 的运行时资源边界正确。

5.2 将复用规则用于这次审查:简短决定记录

Section titled “5.2 将复用规则用于这次审查:简短决定记录”

以下是机制级判断,不是新台账或已经完成的迁移。具体锁定版本沿用 §2。

真实需求 上游设施 已证实差异 决定与 Aira 边界
Exact 子实体索引/邻接 OCCT 8.0.1 TopExp/TopTools 等价关系匹配;WASM 缺绑定 优先薄 native helper;Aira 负责外部 ID/选择域
建模 history 合成 OCCT 8.0.1 BRepTools_History 通用关系已有;设计角色不是上游输出 对照复用收集/合并;不继续复制 collector
跨修改引用恢复 OCCT 8.0.1 TNaming/TFunction 实质重叠;真实恢复率/浏览器成本未知 同一编辑样本比较,不预设现有实现应保留
普通 Field 采样 Fidget 1cef7e8… Function/Tape;既有 v0.1 DAG 求值 当前重复计算已复现;Fidget f32 与现有 binary64 不等价 修共享求值缺陷,测适配后再决定执行底座
ZIP 结构与 3MF 输出 fflate/lib3mf 候选(尚未选定产品版本) ZIP 盲区已复现;Aira loss/授权仍需映射 不继续扩写 ZIP;引入前明确版本及独立互操作检查
模型输入身份 已用 serde_jcs/Ajv;JCS 参考实现 NFC、严格输入、旧 profile 需保留 复用序列化/validator,减少同语义副本,修边界而不改历史
多实体显示/真实边线 Three.js 0.185.1 + OCCT 提取 显示/拾取有现成功能,SemanticRef 映射无现成产品语义 补 adapter 消费范围,不写 renderer
AI 任务评价 Inspect 0.3.260 / Harbor 0.22.0 已配置 CAD 结果与能力充分性是领域判断 继续框架插件;不另写通用 runner,检索测产品实际路径

这张表不给“保留自研比例”。任何保留决定都须有具体职责/差异,后续接线若发现更好的上游实现可以 更改;内部架构选择不等于授权改写用户文件、公共身份或历史契约。

6. 架构选择不能只比较“自研 / 全部换 OCAF”

Section titled “6. 架构选择不能只比较“自研 / 全部换 OCAF””
方案 可能减少的自研 必须实测或承担的代价 当前判断
AMIR + OCCT 原生薄 helper 拓扑索引、history 收集、批量提取和生命周期样板 补绑定、保持外部引用/容差和资源所有权 最直接,应优先做实际替换对照
AMIR + 内部 OCAF 派生状态 命名演化、局部更新/回滚的一部分机制 Labels/history 同步、候选隔离、包体/内存、失败恢复 必须认真比较,不因公共 ID 不同而排除
OCAF 为主文档,AMIR/接口作投影 可能重用更完整的文档/事务/持久化框架 改变当前权威模型、重建/分支/备份兼容与多表示解释;迁移成本未知 是真实架构选项,不是理论上不可能;本轮证据不足以推荐整体迁移

AMIR 不等于必须逐行自研底层;OCAF 也不等于现成 AI CAD 产品。应在相同模型/编辑/失败条件下 比较可删除代码、必须新增的适配、可靠性与浏览器成本。没有反事实实现,不能声称可省 50% 代码或 已证明自研比 OCAF 更优。不得为了使替换看似省代码而删掉用户需要的保护。

7. 建议处置:先纠正真实问题,不继续扩大重复面

Section titled “7. 建议处置:先纠正真实问题,不继续扩大重复面”

以下是本次审计建议,不是已实施变更,也不自动恢复开发:

  1. 修复真实缺口,按消费路径安排。 C1 先处理历史读取来源、Worker 失败清理和 Session 持久化 恢复一致性;草图诊断/转换误差随相关 Exact 路径修正。复杂 Field 启用前修共享 DAG 重算, 3MF 输出/检查扩展前处理 ZIP,provider 开启前处理原始体积限制。不是要求暂停 Exact 等全部 外围问题清零,也不是允许把已知缺口包装成工业能力。复用既有 targeted checks。
  2. 在继续扩展复杂组合前,替换/对照明确的基础热点。 首选 TopExp 索引/邻接、统一 history、 native 批量 mesh extraction。只增加必要绑定,外部 ID 不改为指针或 native ordinal。
  3. 严肃评估 TNaming,但不用它代替上述具体修正。 选现有壳体→切孔→收边的连续编辑样本, 同时检查错误拒绝、歧义、资源释放和净逻辑减少;不预设谁胜出。
  4. 保持一条 Candidate→Revision 执行主线。 重复求值与 Revision-only 耦合是现有额外成本; 复用结果前先修真实求值身份,不能删除第二次调用后改写旧收据冒充新结果。
  5. 索引和薄封装随真实业务收敛。 不继续复制 maker collector、solver adapter、ZIP parser, 不以全量 OCAF 替换、全仓版本治理或新的 Evals 工程阻塞核心建模。

已按用户同意,将四项短记录与复用优先顺序写入 AGENTS.md 和 核心推进计划 §3.1/5.6,纠正“只考虑命名试验”的 过窄范围。产品仍沿 C1 推进,没有重置长期目标、修改 Accepted 合同或自动恢复代码实施。

继续深审的未完成项明确保留:原生 maker 异常资源释放与连续拓扑变化、Exact Session 真实存储 故障注入、Core/TS 语义等价与输入极值、Lane R 算术/证明、DO 账本/provider 完整协议、全 UI 与 历史脚本。下一轮先收窄到前两项 CAD 热路径,不以文档扩写代替它们。

在 Aira 根目录、使用已有 Node 和依赖执行:

终端窗口
node docs/research/2026-09-03-cad-reuse-audit-probes.mjs

探针把受查 TypeScript 源码在内存中编译,不修改源码,不安装包,不联网,不读取用户设计或 API key。 它运行真实 PlaneGCS、实际 Field v0.1/v0.2 编译求值、公共 JSON helper、私有焊接 helper、实际 ZIP 及独立读取器,并检查 npm OCCT 暴露符号;Worker 使用替身 transport,Interface 使用替身 Session。 私有 helper 提取依赖当前函数结构,仅是审计复现工具,不进入产品、根命令或 release Gate。

本轮复现结果与 §3.1–3.7 一致;§3.8–3.9 为源码确认,没有对应浏览器/大体积试验。 它们是问题复现,不是“产品测试全部通过”。所有修复、OCAF 接入收益、 拓扑 map/批量提取的性能改善,以及整个工业零件端到端影响当时尚未验证。以下记录后续已授权的实现, 不将修复后的探针结果冒充原始审查结果。