Aira 开源底座与自研实现重叠审计:修正实施与验证记录
主文档与完整目录。本分篇保留原调查日期的依据与实测记录;其中的当前状态、建议和授权仅属于历史快照,不是执行队列。
9. 修正实施:第一批(2026-09-03)
Section titled “9. 修正实施:第一批(2026-09-03)”用户已授权“设定目标,立刻修正和重构”;目标保持进行中,不以本批通过代表整个审计或 C1 完成。
| 审计项 | 已接入的修正 | 验证与剩余边界 |
|---|---|---|
| §3.5 历史读取错配 | 四条 Exact Interface 读取路径按返回 document 的 RevisionId 求值;共享/Fillet/Revolve Session 显式 revision 求值只读,当前 head 恢复保留证据持久化 | 历史参数、求值绑定、Render source 同版本,head 不变;没有放宽 store 的当前 durable head 校验。尚未注册的历史 revision 仍明确报错,不偷换成 head |
| §3.6 Worker 卡忙 | 发送/构造请求同步失败清理 pending 与 abort listener;取消、崩溃、messageerror 终止并解绑旧 Worker,下次请求才重建 | 6 项回归覆盖发送失败、构造失败、旧消息、重建失败、busy/dispose;复用浏览器 Worker 生命周期,不新增 RPC 框架 |
| §5.1 Session 存储故障 | 将既有 Fillet 恢复模式用于共享 Session:persistCommit 失败后恢复 durable head、清理候选;恢复再失败则关闭 Session | fake-indexeddb + 实际 Rust Core 覆盖 quota 注入、双会话 CAS、恢复失败;不是磁盘断电实验 |
| §5.1 已提交但重放失败 | 共享 Session 先消费候选,再重放;失败返回带 commit receipt/cause 的 COMMITTED_REPLAY_FAILED,明确已持久化、应重新求值而非重提 patch |
验证 head/历史确已提交、重复提交被拒、重放可恢复;旧独立 Fillet/Revolve 的提交失败语义仍待收敛 |
| §3.4 Field DAG 重算 | 复用 v0.1 的按点缓存思路,在 v0.2 共享坐标上下文内按 node memo;每个 repeat 实例独立上下文,求值结束释放 | 原探针 24 节点叶子调用 46,368 → 2,10 节点 55 → 2,数值不变;union/intersection、嵌套 repeat 回归通过。不是全图成本上限或整个网格生成加速倍数 |
| §3.7 JSON 边界 | Canonical helper 拒绝 sparse/inherited array slot;严格解析拒绝数值溢出为 Infinity | 合法 dense JSON 的 canonical bytes 不变;有限 binary64/下溢沿用宿主语义,未重定义其他历史 hash profile |
复用判断(沿用 §5.2,不新增决策台账):
- 需求:Exact 操作失败后可恢复且读取来源正确。现有设施:浏览器 Worker/IndexedDB、现有 AiraProjectStore CAS 与 Fillet 的 restorePersistedHead。差异:这些原语不替应用绑定指定 Revision 和消费 Candidate。决定:保留薄生命周期/事务适配,复用已实现恢复逻辑,不新写存储引擎。
- 需求:同一点共享 Field 节点不指数重算。现有设施:v0.1 缓存求值、§5 锁定的 Fidget。 差异:Fidget 当前比较对象的 f32 路径不能无条件替换 Aira binary64 契约,repeat 又改变坐标。 决定:修复现有解释器缓存作用域,不建新编译器;外部 Field 执行器的整体替换收益仍未验证。
- 需求:JSON 输入与 hash helper 接受域一致。设施:宿主 JSON.parse/stringify、Number.isFinite、 Object.hasOwn。差异:宿主接受溢出数值、数组 map 跳过洞;Aira 另有 NFC 规则。 决定:补两处边界检查,数字序列化继续调用宿主,不扩大手写 JSON/JCS 范围。
实际检查:Contracts 全套 48 文件 / 232 tests;Web sketch/interface/workbench 35 文件 / 144 tests; Contracts typecheck/build、Web typecheck 与原离线探针通过。Session 故障测试的几何 executor 和 evidence 完整性检查为替身,因此证明的是事务与路由,不是新一轮真实 OCCT 几何正确性或 Chrome 全闭环。
剩余:PlaneGCS 诊断传递、Exact→Mesh Float32 预算、ZIP 库替换、显示/网关读取边界、原生拓扑索引/ history/批量提取与连续拓扑变化、旧 Session 收敛,以及 C1 组合 Candidate 接线。优先继续 CAD 热路径, 不把外围全部清零当作 C1 开工条件。没有新 Gate、付费模型调用、部署、Git 提交或历史身份迁移。
10. 修正实施:草图诊断与转换精度(2026-09-03)
Section titled “10. 修正实施:草图诊断与转换精度(2026-09-03)”10.1 草图:保留原生诊断,复用同一证据投影
Section titled “10.1 草图:保留原生诊断,复用同一证据投影”- PlaneGCS
get_conflicting/get_redundant/get_partially_redundant的列表现在独立于 DOF 返回值保留; 原反例dof=null时不再丢掉["x", "x-conflict"]。内部 arc-rule 标签也保留,native vector 仍按既有 finally 释放。 - 失败/invalid/unknown 状态且没有残差不满足证据时,不再单凭 solver 状态声称
inconsistent。 materializer 失败信息包含原生冲突和未满足的 driving constraint IDs;原生明确冲突不作为正常轮廓接受。 - 抽出原有
sketchEvidence为单一 constrained-sketch-evidence.ts, 拉伸、差集 base/tool 共用。新 Candidate/Revision 证据携带约束诊断,工作台显示具体冗余/部分冗余 IDs, 有警告时不显示 verified-clean;旧收据缺诊断时显示 unavailable,不当作空列表。
重要语义核对: 锁定的 constrainedProfile 模块
把 sketch.well-constrained 明确定义为零剩余 DOF,并未定义为“无冗余约束”。因此本次保留它的接受条件,
采用独立诊断,而不是套用早期 spike 的 overconstrained 枚举或把可满足冗余一律拒绝。§3.1 的问题是
消费者只看到简化结论,不是“DOF=0 必须判错”。真实冗余矩形仍得到 960 mm² 的合法轮廓。
复用判断:需求为暴露求解器已有诊断;上游为锁定 PlaneGCS 1.2.0 的上述 getters、 官方 wrapper和冗余约束用例; 差异是 Aira 对 constraint tags 的映射、证据/工作台传递及既有零 DOF 契约;决定只做这些薄适配, 不增加求解/冗余检测算法。可选诊断字段属于浏览器求值证据,历史字段缺失仍可读取,不修改 AMIR、模块 hash 或历史收据。
10.2 Exact→Mesh:按最终存储顶点核算
Section titled “10.2 Exact→Mesh:按最终存储顶点核算”转换实现现在为每个原始顶点测量到最终
Float32 顶点的位移,包括吸附、量化、合并到已有顶点的位移。chordal estimate 使用:
maximumReportedFaceDeflection + max(originalWeldBound, maximumVertexDisplacement)。
没有减轻原有焊接预算;检查在 Manifold/目标图创建前执行,不再额外放宽 1e-12;非有限 Float32 或超预算均拒绝。
复用判断:需求是转换结果真实满足请求的估计误差预算;已有设施为 OCCT mesh metadata、
宿主 Math.fround/Float32Array 和 Manifold 3.5.1 校验;差异是这些设施不会替调用方累计最后的坐标转换
位移,Replicad/Manifold 同样使用 Float32;决定保留现有提取路径并补预算核算,不另写浮点转换或几何内核。
既有 evidence schema 不变,经其 diagnostics 扩展点标记 FLOAT32_VERTEX_DISPLACEMENT_ACCOUNTED;新派生证据
按实际结果计算 hash,旧证据不重写。仍为 measuredEstimate,requireBoundedError=true 继续拒绝,非严格几何误差证明。
验证:真实 OCCT 圆柱位于 z=1000000.001 mm,0.0001 mm 预算在 Float32 位移检查处拒绝,0.2 mm
预算通过,证据位移项至少覆盖约 0.001 mm;原 helper 探针两个远点的漏计均已消除。近原点圆柱、粗/细
网格、确定性重建、语义映射继续通过。OCCT 全套 15 文件 / 49 tests,Web sketch/interface/workbench
36 文件 / 150 tests,两包类型检查、改动文件 lint、原离线探针通过;dist-adapter 已从源码编译对齐。
此次没有新跑 Chrome 端到端或物理存储故障,不能把投影单测说成浏览器全闭环。
本批结束时待办:原生拓扑索引/邻接(随后进展见 §11)、history、批量提取的适用复用与连续变化验证,随后 ZIP、显示与 网关边界;旧 Session 收敛及组合 Candidate 接线仍在队列,整体目标未完成。未调用付费模型、部署或提交 Git。
11. 修正实施:原生拓扑索引与非破坏布尔(2026-09-03)
Section titled “11. 修正实施:原生拓扑索引与非破坏布尔(2026-09-03)”11.1 用 OCCT 索引替换 JS 拓扑扫描
Section titled “11.1 用 OCCT 索引替换 JS 拓扑扫描”需求: 读取和选回真实 Exact 边,保留已有公共身份、邻接语义、周期 seam 排除和失败边界。
上游: 锁定 OCCT 8.0.1 b8f597c6… 的 TopExp::MapShapes、
MapShapesAndUniqueAncestors(..., false)、TopTools_ShapeMapHasher。
源码确认 MapShapes 按 Explorer 顺序首次插入,Hasher 使用 IsSame,后者忽略 orientation、保留 location。
差异: 上游不提供 Aira 的 lineage/role/ArtifactGraph 身份;锁定生成器的 parse-only stub 不支持
val::array() 与带模板参数的 constructor 写法。决定: 使用其支持的标准 Embind factory 与 vector
绑定,不 fork 内核、不修改解析器、不新增拓扑算法;Aira 只负责语义映射和句柄所有权。
feature-graph manifest增加
AiraTopologyIndex,用原生 map 建立唯一 faces/edges 和不同祖先面关系。
薄适配负责 evaluation-local 序号及句柄释放;
EdgeGraph的观测与选回均已使用它,删除原文件的
enumerateUniqueSubShapes 和逐边全脸扫描。seed 通过原生 faceIndex 归组,序号不写入任何公共身份。
真实同一运行时中,屏蔽新增绑定作旧路径对照,覆盖 Box、Shell、Cylinder、Difference、Chamfer、Fillet: 完整 EdgeGraph(包括 BREP hash、subentity ID、邻接、曲线类型和 snapshot hash)相等,按公共 ID 选回的 native edges IsSame。索引路径在这些边读取/选回中创建 0 个 JS TopExp_Explorer;这是跨边界调用结构的 实测,不是全 App 加速倍数。周期圆柱接缝仍排除,真实开放面仍报 NON_MANIFOLD;缺 lineage、缺选中 ID、 部分导出失败、vector 转换失败及选择句柄转移有回归。剩余 BREP 序列化/度量没有被宣称已批量化。
兼容分支仅服务当前仍锁定旧 ABI 的独立 Edge/Fillet/Chamfer/Shell/Revolve 等消费者;退出条件是这些消费者 接入共同 runtime 并通过自己的重建检查。共同 feature-graph 已实际使用 native 绑定,不是只增加未调用 API。
11.2 对照中发现并修复组合输入被布尔修改
Section titled “11.2 对照中发现并修复组合输入被布尔修改”首次全节点对照在旧路径也失败:n.shell 进入 Difference 后,EdgeGraph 对其 face serialization hash
无法匹配先前记录。当前 eager BRepAlgoAPI_Cut(base, tool, progress) 未设置非破坏模式。
OCCT BuilderAlgo
明确提供 SetNonDestructive(true),在需要更新时复制子形状,不原地更新输入。
需求为同一组合图中已求值节点保持其记录对应的 native shape;上游为上述原生选项和
SetArguments/SetTools/Build;差异是选项必须在 Build 前设置,旧 eager 构造器之后才设置已经太晚;
决定补 airaNonDestructiveCut 薄构造绑定,unique_ptr 保护构造失败,成功后交回既有 maker 生命周期。
Difference在共同 runtime 使用此绑定;
组合执行器遇到没有此绑定的旧 runtime 明确拒绝组合
Difference,避免无声回退。独立旧 runtime 仍保留原路径,不将其误报为已迁移。
修复后,同一完整“抽壳→圆孔切割→收边”求值的每个 native 中间 shape 重新序列化,均等于其已记录 exactBrepHash;前述全部节点 EdgeGraph 对照转为通过。公共 authoring schema、RevisionId 算法不变, 不重写历史模型/收据;非破坏布尔是新的运行时行为,不声称其全部派生字节与旧破坏模式相同。
11.3 实际构建、验证与未完成项
Section titled “11.3 实际构建、验证与未完成项”WSL2 Ubuntu-24.04 + Docker 29.1.3,使用原锁定镜像、--network none,运行现有 feature-graph build。
成功 run 为 2026-09-02T19-12-45-091Z(UTC);新增 runtime receipt v0.2,
保留 v0.1 原收据,现有 restore spec 指向 v0.2。未重写产品 release 密封,也未改动原环境调查报告。
WASM raw 从 13,919,751 到 13,924,288 bytes(+4,537),gzip 从 4,864,566 到 4,869,366(+4,800);
新增 helper 的峰值内存、复杂工业件吞吐与独立重复构建字节一致性本批未单独测量。
- OCCT 16 文件 / 56 tests;Web sketch/interface/workbench 36 文件 / 150 tests 通过。
- 两包 typecheck、改动源码 ESLint、9 个 runtime 的既有 supply/restore 检查通过;dist-adapter 已正常构建。
- 没有新 Chrome E2E、付费 provider、部署、Git 提交。共同组合求值与 AMIR 接线测试已用新 runtime, 默认工作台的组合 Candidate/Worker/Session 闭环仍未完成。
本批结束时下一项为 §4.2 原生 history(进展见 §12)和批量提取,再推进 ZIP、显示/网关边界、旧 Session 收敛及 C1 业务接线。 本节不关闭整体目标,也不把未测的 OCAF/TNaming 收益算作已交付。
12. 修正实施:统一原生 history 与来源适配(2026-09-03)
Section titled “12. 修正实施:统一原生 history 与来源适配(2026-09-03)”需求: Fillet/Chamfer/Shell/Difference 消费内核已有 Generated/Modified 关系,保留设计角色、原始
诊断和全部输出 face 的来源,同时减少重复 collector 和跨 WASM 的 list-copy/扫描/清理代码。
上游: 同一锁定 OCCT 8.0.1 的 BRepTools_History(arguments, maker) 模板构造器、Generated、
Modified、IsRemoved,以及上一批 TopExp 输出面索引。
已证实差异: History 只支持 vertex/edge/face/solid,整理关系后 IsRemoved 不等同 maker 的原始
IsDeleted;它不产生 Aira 的 selector-based origin、sourceRole,也不定义 Shell 开口是否仍在输出。
决定: 补原生 factory 和 owned shape-vector 绑定,直接使用库的关系存储/收集;这些 Aira 语义只保留
在薄投影层,不再复制底层 history 容器。原始 maker.IsDeleted 仍单独读取,不能换名冒充 IsRemoved。
实际接线:
- exact-shape-history.ts统一四类操作的关系遍历、 native vector/list 生命周期和失败清理。共同 runtime 实际走 BRepTools_History;旧独立 ABI 仅保留一个 共享 list 适配,随这些消费者接入共同 runtime 后退役。dispose 后不可再读,避免误退回兼容路径。
- exact-finish-lineage.ts合并 Fillet/Chamfer 两份 collector,原文件各删除约 150 行,保留各自 origin 文本、错误码和外部结果字段名。
- 四类操作的输出面关联都改用原生 faceIndex;输出面句柄转交既有 execution,index/history 及附带 edge 句柄立即释放。Shell 的源 edge/vertex 收集仍保留原路径,但其初始化失败已纳入统一清理范围。
- 删除四处独立 consumeShapeList;不引入第二模型权威、OCAF 文档、缓存或调度器。
验证:共同 native runtime 与仅屏蔽 history factory 的兼容读取做完整对照,覆盖壳体宽度 40/48 mm × Chamfer/Fillet 四种组合。每种实际创建三个 native history(Shell、Difference、收边);所有 nodeResults、 诊断计数、结果 hash、source result 和完整 ArtifactGraph 均相等。原生 history 的 shape/list 转换失败、 visitor 抛错、缺 lineage、重复 dispose、输出 face 所有权转交另有回归。前批 seam、开放边界、输入 BREP 不变、失败几何及旧独立 runtime 用例继续通过。
现有构建流程在 WSL Docker、锁定镜像、--network none 下成功,run 2026-09-02T19-21-43-747Z。
runtime receipt v0.3
记录新增绑定,v0.1/v0.2 原收据保留,restore spec 指向 v0.3;dist-adapter 已正常构建。
WASM raw 13,930,780 bytes(较上一批 +6,492)、gzip 4,873,045 bytes(+3,679)。
本批 OCCT 18 文件 / 66 tests,Web sketch/interface/workbench 36 文件 / 150 tests,类型检查、
改动源码 ESLint、既有 runtime restore/supply 检查通过。未新增 Chrome E2E 或大工业件性能/峰值内存测量。
采用结论为:四类当前 Exact 操作有限采用 BRepTools_History,公共来源/诊断语义不变。没有声称任意 maker 的所有关系都已证明等价;没有使用/声称已完成跨阶段 History.Merge 或 TNaming 连续编辑接入。 本批结束时批量提取(随后见 §13)、Shell 源拓扑收集、ZIP、显示与网关边界、旧 Session 和 C1 Candidate 闭环仍待实施; 未调用付费模型、部署或提交,整体目标保持进行中。
13. 修正实施:原生批量面网格读取(2026-09-03)
Section titled “13. 修正实施:原生批量面网格读取(2026-09-03)”需求: 减少每个顶点/三角形跨 WASM 读取,同时保留面来源、已配置的网格化参数和最终 Float32 位移预算。
上游: Replicad 90d176ed… 的 ReplicadMeshExtractor(mesh-extractor.cpp、shapes.ts),
以及锁定 OCCT 的 BRep_Tool::Triangulation、Poly_Triangulation::Node/Triangle/Deflection、gp_Trsf::IsNegative。
已证实差异: Replicad extractor 内部重新网格化,并立即将原始 double 坐标转换为 Float32;
现成输出缺少原始 double 和逐面 deflection,不能直接用于 Aira 当前的位移预算,且其参数不覆盖现有
IMeshTools 设置。决定: 补只读的原生批量绑定,不重写网格化;借鉴其批量复制与变换绕序处理,
保持 Float64 到既有焊接/量化步骤,再用原始坐标核算误差。没有声称直接采用了整个 Replicad extractor。
manifest的 AiraFaceMeshData
使用 OCCT 已有 triangulation,RAII vector 持有 double positions 和 uint32 triangles;不调用新的 mesher,
不以 native faceHash 取代 Aira 身份。复制适配
先读完所有描述符再取得最新 WASM buffer,检查范围/对齐并复制,finally 释放 native owner。
已修正原逐点路径忽略负行列式位置变换的绕序问题;两条路径均按 face orientation 与 IsNegative 联合判断。
兼容读取仅服务尚未迁移共同 runtime 的旧密封 ABI,消费者迁移后退役,不是第二套网格化算法。
真实 Chamfer/Fillet 组合件的批量/逐点读取完整转换结果相等,包括顶点、三角形、面映射、误差证据与 hash;
批量路径将 JS BRep_Tool.Triangulation 替换为抛错仍通过,实际每面一次批量读取。
两条路径都覆盖远坐标 1000000.001 mm 的误差拒绝/通过、粗细网格、确定性及镜像闭合网格正体积。
7 个所有权测试覆盖 memory.grow、double 精度保留、无 triangulation、非法描述符与 getter 抛错后的清理。
锁定镜像、WSL Docker、--network none 构建 run 2026-09-02T19-34-37-176Z 成功;
runtime receipt v0.4
保留此前所有 receipt,现有 restore spec 指向新版本,dist-adapter 已正常构建。
WASM raw 13,933,020 bytes(较 v0.3 +2,240)、gzip 4,871,479 bytes。
OCCT 19 文件 / 80 tests、Web sketch/interface/workbench 36 文件 / 150 tests、两包 typecheck、
改动源码 ESLint、9 个 runtime 的 supply/restore 检查通过。没有声称工业件吞吐/峰值内存已经测量,未跑新 Chrome E2E。
本批结束时 ZIP(随后见 §14)、显示/网关边界、旧 Session、Shell 源拓扑收集及 C1 Candidate 闭环继续;未调用 provider、部署或提交。
14. 修正实施:用成熟 ZIP 库替换手写格式与 CRC(2026-09-03)
Section titled “14. 修正实施:用成熟 ZIP 库替换手写格式与 CRC(2026-09-03)”需求: 浏览器确定性 STORE 导出、正确拒绝损坏包、保留旧包读取及已记录的文件 hash。
上游: 新增显式锁定 @zip.js/zip.js@2.9.0(BSD-3-Clause),使用其公开的
lib/zip-core-custom.js 入口、ZipWriter、ZipReader、Uint8ArrayReader/Writer;核对安装源码
zip-reader.js、zip-writer.js、CRC stream 与类型声明。同步候选 fflate@0.8.3 的 unzipSync 源码
不检查 CRC,只作为显式 devDependency 的独立 ZIP 对照,不作为产品验证器。
差异: zip.js 已有严格 EOCD/目录与 local-header 一致性、重复路径、重叠数据和 CRC 检查;
库不替产品设总体积/条目预算,也不提供完整 3MF schema 检查;其 API 是异步。
决定: 删除自写 ZIP 头、目录、读取循环和 CRC 算法;Aira 只保留 STORE 配置、相对路径限制、
资源预算和 Map 投影。官方能力说明见 zip.js 输入检查、
读取选项。
zip.ts启用 strictness: strict、严格文件名、
checkCrc32、checkOverlappingEntry,任何条目提取前完成元数据/预算检查;限制输入包及总展开数据
各 256 MiB、最多 1024 个文件条目。仍仅接收 UTF-8 STORE,拒绝压缩/加密/目录条目;这是当前
producer subset,不是通用 3MF importer,也不是浏览器峰值内存 SLA。异步处理前复制调用方字节,失败
不返回半成品;reader/writer 生命周期由已有库和 finally 清理。使用上游无预置 codec 入口,关闭 worker
和 CompressionStream,STORE/CRC 路径不需要压缩 WASM 或网络加载。第三方许可随包保留。
明确的兼容影响: 包 0.1.0 → 0.2.0,公开辅助函数 createStoredZip、readStoredZip、
inspectAira3mf 返回 Promise,仓内调用与研究探针已更新;不维持第二份同步 parser。既有异步
exportFieldTo3mf 入口、3MF/XML/loss schema 和模型权威不变。通过原生 writer 选项固定 UTF-8 flag、
版本、属性、raw DOS date,无额外 timestamp/data descriptor;不自行修改写出字节。
升级前捕获的 ASCII/Unicode/空条目以及完整 Beam 文件仍逐字节一致,Beam packageHash 为
sha256:157d9808a13ec5f0bfa80223c0b47ecdb94fdc6df84ffb6b98efeafaec8c5305;不重写历史 release receipt。
超限或非相对路径的旧输入会明确拒绝,不承诺过去过宽接受域全部保留。
验证:2 文件 / 38 tests,覆盖 Core/Beam 独立 fflate 解包对照、历史字节、缺 EOCD/中央目录、截断、
CRC 双头伪造/内容损坏、头字段不一致、重复名字、重叠条目、越界指针、非法路径、计数/体积预算、
异步输入所有权、清理和无 fetch。离线审计探针再次实跑:合法包 121 bytes 通过,原 44-byte 反例被
拒绝为 End of central directory not found。3MF/Web typecheck、源码 ESLint、3MF 构建和 Web Vite
production bundle 通过;Vite 仍有既有 WASM URL、Node 模块 externalized 与大 chunk 警告。
没有新增浏览器运行/下载测试,未完成独立 XML/XSD 或 lib3mf round-trip;原 loss claim 仍为
schemaConformance: notIndependentlyChecked。没有将 ZIP 结构通过升级为完整 3MF 认证。
剩余显示/网关边界、旧 Session、Shell 源拓扑收集及 C1 产品闭环继续;provider、部署、提交均未运行。
15. 修正实施:网关读取前限长与取消(2026-09-03)
Section titled “15. 修正实施:网关读取前限长与取消(2026-09-03)”需求: 管理请求及模型响应不得先读完任意长度的 body 才检查预算;断开或超时必须结束读取,未知
模型费用不能记为零。上游: Node/workerd 原生 ReadableStream.getReader/read/cancel、AbortSignal,
以及项目既有 Fetch adapter 的限长读取。核对 Cloudflare 流读取 API
和最新 Workers 类型;项目仍锁定 workers-types 5.20260901.1,未升级依赖。
差异: 原生流提供背压与取消,不替应用限制累计字节、解析严格 UTF-8/JSON 或结算 admission lease。
决定: 抽出一个共享有界读取,接线普通请求、管理请求及
Responses adapter;不引入第二套 stream/parser,不改变认证顺序、DO 存储或生产 provider-off 配置。
管理 body 为 4 KiB,普通请求维持既有 1,000,000 bytes;provider 原始响应默认也是 1,000,000 bytes, 与归一化输出预算独立。实际逐块计数,不信任 Content-Length;提前拒绝非法/超限 header。单个拥有的 增长 buffer 避免每字节一个 chunk 对象,复制 transport view 防止重用改写;失败取消,finally 释放 reader。 abort 能打断等待中的 read,即使底层 cancel cleanup 不结束也不挂住;取消错误不覆盖原始限长错误。 provider 非 2xx 直接取消 body;2xx 必须先通过限长、fatal UTF-8、既有严格 JSON,再投影。tool 原始参数 字符串及其 hash 不重写。超限/非法响应为结构化 502,读取中超时 504,调用方取消 499;admission 仍结算 一次,usage 缺失仍是 unknown,不伪造零使用量。
验证:gateway Node 5 文件 / 73 tests、真实 workerd 3 文件 / 52 tests,其中共享测试在两环境 重跑,不将合计当独立用例数。覆盖不报/谎报长度、逐字节 UTF-8、transport buffer 重用、挂起 read/cancel、 重复 key/lone surrogate/非有限数、超限 admin 不修改控制状态、超限 provider exactly-once finish。 两套类型检查、改动源码 ESLint、gateway build 通过。全部 fake transport,无真实模型调用、部署或提交。
16. 修正实施:旧 Exact Session 复用与保存失败恢复(2026-09-03)
Section titled “16. 修正实施:旧 Exact Session 复用与保存失败恢复(2026-09-03)”需求: 圆角/旋转提交遇到存储失败或提交后 Worker 失败时,用户不得看到未保存的 head 或被引导重复
提交;相同事务流程不能继续维护多份。设施: 既有 Core/WASM 事务、IndexedDB persistCommit CAS
和 Shell/Chamfer 已接入的共享 Exact Session;这是复用项目设施,不是假称采用 OCAF 持久化。
差异: Fillet 与共享 Session 的 source/binding/备份流程等价;旧 Revolve binding 没有 sourceRevisionId,
且 worker 参数与 SemanticRef 校验不同,强行套入会改变历史证据。决定: Fillet 改为约 100 行薄适配,
删除约 850 行重复流程;Revolve 保留历史协议,仅与共享 Session 共用持久化/重放边界。
保存失败恢复 IndexedDB 的实际 head(包括并发赢家),丢弃过期 staged candidate;恢复也失败则关闭
Session,保留两项错误。保存成功即消费 Candidate,随后几何或证据保存失败抛出携带 commit receipt 的
ExactOperationCommittedReplayError,明确只重放该 Revision,不再次提交。打开失败会释放已创建 Core
和 store;恢复时先验证替代 Core head 再交换所有权。旧公开 error class 导入路径保留重导出。
模型/schema/hash、Fillet materializer/证据版本、Revolve 无 source 的 binding、历史只读入口不变。
Fillet 的内部 Session disposed/import 等错误文案收敛到共享 EXACT_FILLET_* 命名,不承诺旧内部文本逐字
兼容;现有调用方不依赖这些文本。没有新增备份格式、事务引擎、OCAF 文档或迁移历史数据。
四类 Session 定向 4 文件 / 23 tests;完整 Web 53 文件 / 231 tests、类型检查与改动源码 ESLint 通过。真实 Core WASM + fake-indexeddb 覆盖 quota、CAS 竞争、双重失败、提交后 Worker/证据写失败、重开 恢复、不重复提交和旧 Revision 角度读取;几何 executor 在这些 Session 测试中是 fixture,不冒充真实 OCCT/浏览器 E2E。原 Fillet 添加/改半径/回退/备份导入和 Shell/Chamfer 流程继续通过。
剩余显示范围/真实边线、Shell 源拓扑收集及 C1 业务闭环继续;不把本批标作全仓审查或上线完成。
17. 修正实施:多 primitive 显示、范围与拾取(2026-09-03)
Section titled “17. 修正实施:多 primitive 显示、范围与拾取(2026-09-03)”需求: RenderPacket 中的每个实体都可显示/拾取,共享缓冲不能把其它范围误画出来,面高亮不能越界。
上游: 锁定 Three.js 0.185.1 的 BufferGeometry、Box3、Mesh、EdgesGeometry、Raycaster;核对本地
Mesh.js、EdgesGeometry.js,与 r185 原生拾取
和轮廓提取对照。
差异: Mesh 拾取遵守 drawRange,但自动 bounds 包括未使用的 position,EdgesGeometry 忽略 drawRange。
决定: 薄 RenderPacket 对象投影遍历全部 primitive,
直接调用原生设施;轮廓输入仅给该索引段的 view,bounds 只含该段实际引用的顶点,不另写 renderer/边线算法。
每个 mesh 保留完整 index buffer,并设置 firstIndex/indexCount;原始索引缓冲的 triangle 编号沿用到 拾取及 provenance,不重排或切成局部编号。面高亮根据 primitiveId 找到对象并受该 draw range 限制。 多份 artifact range 同时声称一个命中时不取第一项;材质 opacity 现由原生属性消费。坏 primitive 范围、 重复 ID、错误 buffer role/尺寸、越界 index 或非有限引用顶点会拒绝;当前三角形范围要求 firstIndex/ indexCount 都按 3 对齐。不改变 RenderPacket wire 版本,过去未定义的非法范围不再静默接受。 整个新模型构造成功才替换旧模型,途中失败清理新建的几何/材质;重载和 dispose 统一释放全部 primitive。
验证:显示适配 16 tests 使用真实 Three.js 几何/EdgesGeometry/Raycaster(仅 GPU/DOM shell 为替身), 覆盖两个共享缓冲实体、未引用远点、原始 triangle 编号、面高亮越界、坐标变换、冲突 provenance、失败保留 旧模型与清理。完整 Web 54 文件 / 247 tests、typecheck、源码 ESLint 和 Vite production build 通过; 既有 WASM URL / externalized Node / 大 chunk 警告仍在。
补跑既有 Chrome release 两条 Fillet 用例时,发现用例仍打开已改为约束 L 形件的默认路由并匹配旧 K7
文案/参数名;只将这两条用例固定到既有 ?model=fillet,按当前标签同步定位,不改产品默认路由或降低
head/数值断言。第一次原测试失败和修正后结果分开记录;其余旧 release 用例未重跑,不声称整套 release 通过。
最终现有 Google Chrome release config + production Vite preview 2/2 通过:真实选面/圆角预览/提交/
刷新/回退,以及草图宽度 20→24 mm、拉伸距离 30→36 mm 的预览/提交/刷新。只修正这两条用例的
路由和当前可访问名称/参数摘要;没有把旧 K7 Gate 名称强加回产品。多 primitive 特有场景仍仅由上述
真实 Three.js CPU 测试覆盖,尚未新增其浏览器像素/视觉回归。测试服务器和隔离浏览器已由 runner 退出。
曲边高亮尚未完成。 当前 ExactEdgeHighlight 输入仍只有 min/max,不能据此还原圆/椭圆/B-spline。 下一批应从 OCCT 提取绑定到 edge ID 的真实离散线数据,再接入原生线显示;不能把本批多实体修正写成 真实 Exact 曲边已交付。Shell 源拓扑收集与 C1 产品组合闭环亦未完成;没有真实 provider、部署或 Git 提交。
18. 修正实施:Shell 源边与顶点采用原生索引(2026-09-03)
Section titled “18. 修正实施:Shell 源边与顶点采用原生索引(2026-09-03)”需求: Shell 的源边/顶点来源收集不再跨 JS 逐项 IsSame 扫描,同时保持来源和历史 hash。
上游: 锁定 OCCT 8.0.1 的 TopExp::MapShapes、
NCollection_IndexedMap/IndexedDataMap、TopTools_ShapeMapHasher。本地源码确认 MapShapes 按 Explorer
顺序加入,IndexedDataMap::Add 对已有 key 保留原值。差异: 现有输出面索引不能表达每一个输入
face seed 的来源;同一拓扑面可能对应多个来源 seed,不能仅去重 face 后丢掉标签。
决定: 在共同 runtime 补 AiraSourceTopologyIndex 薄绑定,原生 map 负责去重与索引,返回输入
seed 序号;适配只负责来源 union、排序及句柄所有权。
不写新拓扑算法,不把运行期 ordinal 当公开身份。
Shell 已接入该设施,删除操作内部的源拓扑扫描实现。保留首个形状的方向/位置和所有 seed origins。 旧密封 Shell ABI 暂经同一适配的 Explorer 兼容分支,待共同 runtime 迁移后退役;兼容分支也修复 IsSame/迭代异常时当前 occurrence 的释放,避免预先导出整批临时句柄后泄漏。native vector、索引及 部分导出的 shapes 均有失败清理;输入 face 借用,不删除调用方对象。
2026-09-08 更新:消费者统一到共同运行时后,上述旧 Shell 分支及无消费者夹具已在工作树退役。 本地 v0.17 继续复用锁定 OCCT 的 TNaming Valid 标签过滤,将解析范围限制到源特征与依赖祖先, 修正下游 Shell 历史将源面选择导向 Shell 面的问题,保留公开语义引用与唯一性验证。 原生拓扑/释放对照、上游复用证据和实际连续编辑结果见工作进度 §7.1。
真实 WASM 测试覆盖各组合节点边/顶点顺序、IsEqual、序列化签名、重复 seed 与 Unicode 来源排序; 平移后的相同 TShape 保持独立,反向 occurrence 合并但保留首次方向。native-only 对照把 JS Explorer 替换为抛错仍通过。48 mm 壳体→差集→Fillet/Chamfer 两条完整输出及每节点证据/hash 与兼容路径相等, 实际每次 Shell 构造两个原生 source index。9 项故障/所有权单测覆盖中途导出、无效 ordinal、缺少绑定、 构造/比较异常与重复 dispose。未将此解释为大工业件吞吐/峰值内存已经测量。
锁定镜像、--network none 构建 run 2026-09-02T20-36-44-310Z 成功;新增
receipt v0.5,
旧收据不覆盖,restore spec 已指向新版本,dist-adapter 已构建。WASM raw 13,937,065 bytes
(较 v0.4 +4,045),gzip 4,872,271 bytes。完整 OCCT 20 文件 / 94 tests、Web
54 文件 / 247 tests、两包类型检查、改动源码 ESLint、9 个 runtime supply/restore、diff 检查通过。
本批没有新增 Chrome 测试,没有模型调用、部署或 Git 提交。
剩余: 真实曲边显示仍未接线;三个旧 Gate 只有 edge bounds,不能据此声称精确曲线。需补原生 离散数据的派生显示通道,不能静默改写既有 edge snapshot/证据或旧 runtime 身份。C1 Candidate 组合产品闭环仍按原计划推进,不把本批内核替换写成 C1 或工业上线完成。
19. 修正实施:真实 Exact 边线与只读显示通道(2026-09-03)
Section titled “19. 修正实施:真实 Exact 边线与只读显示通道(2026-09-03)”需求: 显示已解析 Exact edge 的实际曲线,不再用 bbox 对角线冒充边;保持历史几何与证据身份。
上游: 锁定 OCCT 8.0.1 的 BRepAdaptor_Curve、
GCPnts_TangentialDeflection、
BRepTools::Read,以及 Three.js 0.185.1 的 BufferGeometry/Line/LineLoop。
差异: Replicad EdgeMeshExtractor 会确保/更新 mesh,返回 Float32 与内部 edge hash;这里要求不修改
输入拓扑,并绑定 Aira 选回的 edge。旧密封 runtime 也没有所需曲线 API,不能为显示改写其历史身份。
决定: 共同 runtime 加只读 AiraEdgePolylineData 薄绑定,离散计算完全调用 OCCT;
显示适配只复制 Float64 数据、管理所有权及绑定来源。
默认离散参数为 0.02 mm / 0.1 rad;位置和反向 occurrence 由原生曲线/方向处理。单边最多 65,536 点、 单次最多 512 边/262,144 点;native 缓冲复制前重新取得 WASM memory view,异常和成功均释放句柄。 点数限制在原生采样后检查,不是采样耗时或内存峰值保证;Worker terminate 与 WASM 上限仍是隔离边界。 派生 sidecar 绑定 snapshotHash、Revision、evaluation、artifact graph 和 runtime manifest,不写入旧证据。 Three.js adapter 已删除 bbox 圆柱,使用真实 Line/LineLoop;非有限/退化数据、重复或过期身份拒绝, 部分失败与重载释放几何/材质。这是显示近似,不是新的 Exact 证明或直接 Edge 拾取能力。
三个旧 Edge/Fillet/Chamfer Gate 已显式请求派生显示。旧 heap 通过只读 BREP 序列化交给共同 runtime, 不传跨 heap 指针、不替换源模型;ASCII 往返可能有约 1e-14 的浮点差异,因此只用于显示。 兼容成本: 首次请求额外载入共同 WASM(raw 13,940,096 bytes、初始内存 64 MiB),保留至 Worker 退出;真实峰值未测。默认产品 client 的选项为 false,不开启此通道。消费者迁移同一共同 heap 后, 移除 BREP 桥和第二 heap;不将它发展为平行几何路径。Vite 产物包含资源,按需请求不等于零发布包体成本。 Edge client 同时复用既有共享 Worker owner,保留公开错误类型,修正同步发送失败和 messageerror 后恢复。
锁定镜像 / 无网络构建 run 2026-09-02T20-46-29-815Z 成功,新增
runtime receipt v0.6,
旧收据不覆盖;WASM 比 v0.5 增加 3,031 bytes,gzip 4,872,408 bytes(增加 137)。
完整 OCCT 21 文件 / 108 tests、Web 56 文件 / 263 tests、类型/改动源码 lint/生产构建及
9 runtime supply/字节校验通过。真实 WASM 覆盖圆、圆弧、混合斜率直线、平移/反向、独立旧 heap 的
BREP 桥及源字节不变;Three.js 测试覆盖曲线顶点、闭环、错误清理;旧完整图/hash 对照保持通过。
Chrome:DEV-only 三个 Gate 3/3 通过,canvas 截图已检查;既有 production-preview Fillet 两条 预览/提交/刷新/回退及上游参数用例再次 2/2 通过。最初误用 release config 跑 DEV Gate 因路由 不可用而失败,已停止后改用既有开发配置,未开放生产调试路由。三个 Gate 当前是直边样本;圆/弧由 上述原生与 Three.js 测试覆盖,未声称浏览器椭圆/B-spline、完整 release suite 或大模型性能已验证。 无付费模型、部署或 Git 提交;测试服务已退出。
20. 本轮目标核对与未完成边界
Section titled “20. 本轮目标核对与未完成边界”本轮目标列明的修正已落地,不等于整份审计所有研究候选、所有文件深审或工业产品完成:
用户随后单独授权提交:9418689 已纳入十一批代码、测试、复用规则与文档;未推送或部署。
前文各批“未提交”是当时状态,不改写为新的验证结果。本机环境报告未纳入该提交,仍保留本地改动。
| 目标内事项 | 实现与验证记录 |
|---|---|
| 历史 read 来源、共享 Worker 失败清理、Session 持久化恢复 | §9、§16、§19;含真实 Core + IndexedDB 故障注入,浏览器正常事务回归 |
| Field DAG、严格 JSON、草图原生诊断、最终 Float32 位移 | §9–10;保留数值/历史协议边界 |
| TopExp 邻接与源拓扑索引、history、批量面读取 | §11–13、§18;共同 runtime 采用,完整输出/身份对照,旧 ABI 兼容分支有退出条件 |
| 成熟 ZIP 替换、网关原始读取限长 | §14–15;ZIP/CRC 不再手写,未声称完整 3MF 验证或真实 provider conformance |
| 全 primitive 显示/拾取范围、真实边线 | §17、§19;删除 bbox 替代,保留显示与 Exact 权威分界 |
后续沿原 C1 计划接通真实 Candidate 组合执行、特征图增删连接及工业零件闭环。TNaming/TFunction 连续编辑对照尚未实施,不判定自研优胜;IndexedDB 二级索引、中文目录检索、Query 实验 cycle 防护仍是已记录的后续缺口,不冒称清零。全 maker 异常矩阵、Core/TS 极值等价、Lane R 证明、DO/ provider 完整协议和全 UI/历史脚本深审也未完成。已有 targeted fixes 不替代这些专项结论。