跳转到内容

Aira Phase 1:PlaneGCS / ezpz 约束求解器对比

日期:2026-08-31 状态:Experiment Verified / Backend Decision Provisional 机器证据:sketch-solver-comparison-v0.1.json 实现边界:aira-sketch-solver-spike

这个实验不只问“哪个库能把一条线解出来”,而是验证 Aira 能否拥有一个后端中立、AI 可理解且 可验证的 Sketch2D 求解边界:稳定实体/约束 ID、driving/reference、精确或显式 unknown 的 DOF、 欠约束、冲突/冗余候选、初值分支、尺度归一化、独立残差和完整执行参数。后端私有 index、WASM handle 与算法配置不得进入 AMIR 或 Revision 身份。

实现 锁定版本 本地不可变提交 许可证与边界
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)承载,因无存续非归档调用方现已退役,不保留孤立后端分支。

实验定义了一个 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。

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 的完整诊断语义。

Phase 1 首个浏览器纵向切片临时使用 PlaneGCS,原因仅限:已有可运行 WASM、精确 DOF、冗余/冲突 候选 API。这个选择是可撤销的 adapter 决定,不是 AMIR 或 Revision 格式决定;ezpz 继续作为 MIT/Rust alternate 和差异检查来源。两端均保持 productionEnabled=false。

进入 production 前必须关闭:

  1. Aira 自有的最小冲突/冗余归一层,避免 PlaneGCS contradiction diagnosis unavailable 与 ezpz redundancy silent acceptance 直接泄漏为产品语义;
  2. PlaneGCS LGPL 的动态/可重链接边界、对应源码、notice、replacement/relinking、SBOM 与 metadata 冲突审查;
  3. circle/arc/tangent、拖拽 temporary constraint、大草图、退化初值、取消、浏览器内存与重复求解 corpus;
  4. 后端升级 conformance:同一 Aira 请求只能产生相容的状态/残差/显式 unknown,不允许私有 ID 渗入长期身份。

说明:历史 spike 命令(spike:phase1:sketch-solver、verify:phase1:sketch-solver)以及 crates/aira-sketch-ezpz runner 与 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;若未来宣称“全仓完整检查可在无额外工件的纯检出运行”,必须先 消除该旧依赖。

本报告裁决的下一实现已经完成 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 生产许可证/诊断阻塞项。