Aira Phase 1:PlaneGCS / ezpz 约束求解器对比
日期:2026-08-31 状态:Experiment Verified / Backend Decision Provisional 机器证据:sketch-solver-comparison-v0.1.json 实现边界:aira-sketch-solver-spike
1. 要回答的问题
Section titled “1. 要回答的问题”这个实验不只问“哪个库能把一条线解出来”,而是验证 Aira 能否拥有一个后端中立、AI 可理解且
可验证的 Sketch2D 求解边界:稳定实体/约束 ID、driving/reference、精确或显式 unknown 的 DOF、
欠约束、冲突/冗余候选、初值分支、尺度归一化、独立残差和完整执行参数。后端私有 index、WASM
handle 与算法配置不得进入 AMIR 或 Revision 身份。
2. 锁定的一手实现
Section titled “2. 锁定的一手实现”| 实现 | 锁定版本 | 本地不可变提交 | 许可证与边界 |
|---|---|---|---|
| Salusoft89/planegcs | 1.2.0 | ee9b156da9827a91a56a888a53520f63d5cffaa6 |
源码/LICENSE 为 LGPL-2.1-or-later,package.json 写 LGPL-2.0-or-later;浏览器分发尚未获工程/法律放行 |
| KittyCAD/ezpz | 0.2.29 | 915882cc731da31042ce494c89b10334ee57837a |
MIT;Rust core 可直接嵌入,但官方 ezpz-wasm 当前是 sample/benchmark,不是通用 solver wire API |
坐标由 SOURCES.lock.json 管理;两个 checkout 都已
通过 commit、origin、shallow、clean 验证。PlaneGCS 产品依赖另由 pnpm-lock.yaml 锁定;ezpz 历史
独立的 WSL spike 原由 crates/aira-sketch-ezpz(Cargo.lock)承载,因无存续非归档调用方现已退役,不保留孤立后端分支。
3. Aira 自有边界
Section titled “3. Aira 自有边界”实验定义了一个 unpublished、spike-local 的共同请求:point/line、五类最小 constraint、稳定 ID、 driving/reference、毫米单位、characteristic-length normalization 与完整 solver profile。Aira 对 request 和 parameterization descriptor 做 canonical hash;TypeScript 与 Rust 端必须得到同一 hash。
结果不会用空数组冒充后端能力:
- PlaneGCS 的
dof() == -1被保留为 unknown; - ezpz 的 underconstrained variable IDs 不被当成独立 DOF 数量;
- ezpz 不存在的 redundant/conflict candidates 被标为 unknown;
- reference constraint 不送入方程组,只由 Aira 的独立 residual checker 测量;
- 所有 driving constraints 在后端返回后重新检查,solver success 不能自签几何约束成立。
数值算法、阈值、最大迭代、归一化、上游版本、adapter 版本和 parameterization hash 只进入 ExecutionManifest/evidence,不进入权威 authoring identity。
4. 共同 corpus 与结果
Section titled “4. 共同 corpus 与结果”10 个 case 覆盖:欠约束线、完全约束水平线、一致冗余、矛盾距离、正/负初值分支、
10^-3 / 1 / 10^3 三档尺度以及 reference 不驱动。
| 观察 | PlaneGCS 1.2.0 | ezpz 0.2.29 |
|---|---|---|
| 欠约束线 | 精确 DOF = 3 | 标出 p0.x/p0.y/p1.x/p1.y 涉及自由度;无精确 DOF 数量 |
| 完全约束线 | DOF = 0,独立残差通过 | underconstrained variables 为空,独立残差通过 |
| 一致冗余 | 识别 c.p1y redundant candidate |
静默视为 well-constrained;无 redundancy API |
| 矛盾距离 | solver failed;DOF/conflict/redundancy diagnosis unavailable;独立残差拒绝 | 返回 c.p0x/c.p1x/c.distance unsatisfied;独立残差拒绝 |
| 正/负初值 | 两个分支均保留 | 两个分支均保留 |
| 三档尺度 | 归一化后全部通过 | 归一化后全部通过 |
| reference | 不驱动,仍被独立测量 | 不驱动,仍被独立测量 |
结论不是“PlaneGCS 全面优于 ezpz”。PlaneGCS 的 DOF/冗余诊断更接近工业草图需要,并已有浏览器 WASM;ezpz 的 Rust/MIT 边界更干净,且矛盾 case 的 unsatisfied IDs 比本次 PlaneGCS 返回更有用。 二者都不足以单独成为 Aira 的完整诊断语义。
5. 临时裁决
Section titled “5. 临时裁决”Phase 1 首个浏览器纵向切片临时使用 PlaneGCS,原因仅限:已有可运行 WASM、精确 DOF、冗余/冲突
候选 API。这个选择是可撤销的 adapter 决定,不是 AMIR 或 Revision 格式决定;ezpz 继续作为
MIT/Rust alternate 和差异检查来源。两端均保持 productionEnabled=false。
进入 production 前必须关闭:
- Aira 自有的最小冲突/冗余归一层,避免 PlaneGCS contradiction diagnosis unavailable 与 ezpz redundancy silent acceptance 直接泄漏为产品语义;
- PlaneGCS LGPL 的动态/可重链接边界、对应源码、notice、replacement/relinking、SBOM 与 metadata 冲突审查;
- circle/arc/tangent、拖拽 temporary constraint、大草图、退化初值、取消、浏览器内存与重复求解 corpus;
- 后端升级 conformance:同一 Aira 请求只能产生相容的状态/残差/显式 unknown,不允许私有 ID 渗入长期身份。
6. 重放(历史记录)
Section titled “6. 重放(历史记录)”说明:历史 spike 命令(
spike:phase1:sketch-solver、verify:phase1:sketch-solver)以及crates/aira-sketch-ezpzrunner 与 Node adapter 现已退役(因无存续的非归档调用方,草图统一由 PlaneGCS WASM 承担)。以下保留历史 Windows 11 + WSL2 环境下的重放过程记录作为对比证据:
# 历史执行入口(现已退役):# pnpm run spike:phase1:sketch-solver# pnpm run verify:phase1:sketch-solver当时第二条重新运行 PlaneGCS WASM、通过 WSL2 运行锁定的 ezpz Rust binary、复核跨语言 hash、独立
residual 与全部 12 项 Gate。AIRA_EVIDENCE_RECEIPT_ONLY=1 只用于 fresh-checkout 的全局证据路径
核验,不替代显式 replay。实验未启动 gateway,也未调用任何真实 provider。
提交 d627346 随后在全新 detached worktree 执行冻结离线安装,并按正式入口完成:
pnpm run verify:phase1:sketch-solver:两个真实后端重新运行,10 cases / 12 gates 全通过;pnpm run verify:evidence-reproducibility:20 verifiers / 33 reports / 176 tracked paths,missing、 ignored、untracked 均为 0。
主工作区当时完整 pnpm check 同时以 209 个 JS/WASM tests 与 27 个根 workspace Rust tests 通过;
此前显示的 29 是不同 worktree 共用 Cargo target 造成的错误复用,现已由 per-worktree target identity 修正。
纯 Git 检出的全仓 pnpm check 仍会在 P0B-S3 有意忽略的 OCCT custom-build 模块处失败;这不是
本 Gate 的 solver 失败,也不能被隐藏为已解决。正式 evidence 命令会构建可分发 OCCT baseline 并对
custom build 使用 sealed receipt;若未来宣称“全仓完整检查可在无额外工件的纯检出运行”,必须先
消除该旧依赖。
7. 后续切片状态
Section titled “7. 后续切片状态”本报告裁决的下一实现已经完成 browser preview half:PlaneGCS 通过显式 browser export 进入 Web
Worker,Aira Profile2D checker 消费同一稳定 ID/残差/DOF 结果,Manifold 产生 MeshSolid / preview-only,
renderer-neutral RenderPacket 再交给 Three.js。canonical hash 已从 Node 专用实现迁移到 Web Crypto,
原 evidence hash 保持不变;浏览器 bundle 明确排除 ezpz Node adapter。
该后续结果与 ExactSolid 下一边界见 Phase 1 Sketch2D→feature 浏览器纵向切片。 它没有反向升级本报告的临时后端裁决,也没有关闭 PlaneGCS 生产许可证/诊断阻塞项。