# 验证记录

最近回归日期：2026-10-31。平台：Windows；MoonBit 编译器 0.10.16+b1a0e846e（2026-10-16），moon / moonrun 0.1.20261020。四后端、集成、浏览器、独立数值与 ezdxf 读取均使用新工具链生成的引擎复测。

## FreeCAD 原生导入

2026-10-31 使用 FreeCAD 1.1.4 的内置现代 DXF 导入器与几何内核，实际导入圆形、常规凸轮、正偏置三例，保存 FCStd 文档并查询闭合、点数、包围盒、周长、面积及顶点双向距离。原始 0.4.0 输出几何通过但提示未声明图层，main 已补齐 MOONCAM 图层和 CONTINUOUS 线型表，复验不再出现该警告。完整三组 GUI 截图尚未完成。记录与限制见[CAD 导入验收](CAD导入验收.md)，不能据此声称商业 CAD 全面兼容或制造可行。

## 0.10.16 工具链升级

2026-10-31 下载官方精确版本 0.10.16+b1a0e846e 和配套 core，工具链 ZIP 与官方 SHA-256 校验一致。旧工具链保留在原目录，新的本地验证使用独立 SDK。构建前检查 moonc >= 0.10.16，CI 额外要求与 .moonbit-version 精确一致。

新编译器无需修改核心算法。moon info 生成的公共接口将 Int 显示为 Int32，接口快照与生成 API 文档已更新。旧基准与 0.3.0 发布记录保留当时的版本和日期，不将历史测试改写为新工具链结果。升级后已发布 Mooncakes 0.4.0，并完成独立安装验收。

## 已完成检查

| 检查 | 本地结果 |
| --- | --- |
| moon fmt --check | 通过 |
| moon check --deny-warn --target all | 通过 |
| MoonBit 单元与性质测试 | 62 组（54 组固定用例 + 8 组随机性质用例），Wasm、Wasm-GC、JS 各通过；Native 由 CI 覆盖 |
| CLI 与导出集成测试 | 23 组通过 |
| 一致性比较器回归测试 | 9 组，覆盖严格平台要求、CLI 失败及无效清单；独立于核心与集成测试计数 |
| JSON 契约随机性质测试 | 8 组通过，含 1,500 例结构变异模糊测试 |
| 独立数值验证 | 205 组参数、149,983 个采样点、171,940 条断言（0.4.1 本次运行）通过 |
| 40 位十进制参考 | 22 组算例、402 个点，坐标差 ≤8.7e-16、压力角 ≤1.9e-13、曲率 ≤1.6e-12（按算例最大值归一） |
| 跨平台一致性清单 | 5 组算例 × 4 类产物 + CLI 文件，Windows 生成本机清单；Linux 清单由 CI 生成并比对 |
| 浏览器测试 | 桌面、手机、旧响应、参数修改、兼容模式、诊断定位、三档比较和交叉高亮、分段表格与完整操作流程共 13 组通过 |
| 纯 MoonBit 示例 | Wasm-GC 后端直接运行成功 |
| 中文显示检查 | 查看桌面、手机截图，未发现缺字或乱码 |

## main 新增版本与性能验收

引擎版本、源码指纹与模块版本同步检查；分析、拒绝、搜索、错误和 CLI 保存报告均保留生成信息，网页显示实际加载引擎的身份。新增确定性拓扑访问量、128 段标量扫描与固定搜索测试，并执行三类摘要固定负载的体积和宽松耗时门禁。具体口径见[版本追溯与性能护栏](版本追溯与性能护栏.md)。这些更新已随 0.4.0 发布到 Mooncakes。

## 0.4.0 注册表安装验收

2026-10-31 发布 0.4.0，精确源码 dcfa1c6 的远程 CI 通过。实际发布包独立解压后两后端各 54 组测试通过。官方索引和下载归档经校验后，仓库外消费工程通过 moon add 安装精确版本，JS 与 Wasm-GC 均验证接受状态、点数、压力角、诊断位置和生成版本指纹。注册表、本地发布包和官方重新下载包 SHA-256 一致。网络处理过程与完整记录见[0.4.0 版本说明](releases/0.4.0.md)。

## 0.3.0 注册表安装验收

2026-10-26 发布 0.3.0 后，在仓库外新工程通过 moon add 安装精确版本，依赖来自注册表。JS 与 Wasm-GC 均完成采样接受、点数、压力角和诊断位置核对；注册表归档校验和与本地 ZIP 一致。发布 ZIP 独立解压后的两后端也各通过 52 组测试。详情见[0.3.0 版本说明](releases/0.3.0.md)。

## 编码器防御、证据矩阵与兼容模式

G17～G19 将现有三个证据用例纳入[判定验收](判定验收.md)，截断测试同时检查每组证据的两条边都可定位。新增 3 组 MoonBit 测试覆盖：编码器非法边号与角度的原因保留、不一致诊断或证据的类型化失败，以及简化拓扑入口对确定/不确定/失败输入的返回约定。报告编码不依赖 panic；未声称已发现合法用户输入能破坏内部编号。

浏览器在无 Worker 时取消并禁用比较，构造请求再次阻止启用；原兼容模式测试新增脚本改写复选框后的请求核对，另加运行中 Worker 失败转入兼容模式的测试。两者均验证单档计算及导出，后者确认原先勾选的比较被取消、提示持续可见。普通 Worker 下的三档比较回归保持通过。

G05/G14 说明限定在当前工具链和已验证浮点环境，不能把四后端测试结果推广为所有未来浮点收缩、重排与次正规数策略下的逐位一致保证。

## 运动段表格与完整操作流程

新增 2 组 MoonBit 测试检查混合规律、总量、累计升程的字段定位、非法与超限输入；新增 1 组接口测试验证分段校验与完整分析复用规则，且不会改变已缓存导出。

新增 3 组浏览器用例覆盖逐段规律与 JSON 导入/保存往返、空白数值定位、添加删除、迟到校验响应不覆盖新输入、手机不溢出，以及超限→定位→36 mm 搜索候选→三档比较→DXF 下载的完整流程。既有未知字段用例同步改为验证非法 JSON 草稿不替换表格。已查看新桌面与手机截图，中文显示正常。

教程见[完整操作案例](完整操作案例.md)。搜索结果不自动改写输入，教程要求明确填写候选后重新计算；导出缓存与过期提示保持一致。

## 位置、诊断与证据验收

新增 8 组 MoonBit 测试覆盖统一段界、闭合点和末边归属、极值下标、阈值等号、各档独立对照、状态跨档改变、边对证据及不确定报告。证据截断用 71 点星形折线与独立二次交叉计数核对，保留 32 组证据不截断实际计数。

新增 4 组接口测试检查点表与位置字段的一致性、可选比较开关与上下限、边端点和点表坐标一致，以及搜索最终尺寸的逐档独立复算。会话导出在比较后仍使用原报告的网格。

新增 3 组浏览器验收检查“诊断点号=滑块下标=接触点下标=曲线游标下标”、两条交叉边的高亮及重新计算后清除、手机比较表局部横向滚动。已修复比较表撑宽手机页面的问题，已查看中文截图，未发现缺字或乱码。

截图由测试流程保存到 test-results/，文档图片使用同次运行的副本。操作及编号约定见[位置、诊断与采样比较](位置诊断与采样比较.md)。

## 独立数值方法

生产代码使用展开多项式与解析导数；验证程序用 Bernstein 基函数（二项尾）表达位移，并按乘积法则求导，与展开形式不共享代数过程。曲率由滚轮中心轨迹的参数方程 `(px'', py'')` 独立求取，而不是复用库内的包络闭式；验证程序同时比对自身的两条路线与教科书峰值系数（摆线 2、2π、4π²；3-4-5 1.875、10/√3、60；4-5-6-7 2.1875、7.5121、42.0），任一条路线写错都会先被自身检出，而不是与库的错误相互抵消。

覆盖范围：205 组参数，包含三种规律 × 四个基圆 × 三个滚轮 × 五个偏置（含负偏置与接近上限的偏置）、不均匀分段（55°/35°/110°/25°/95°/40°）、八段密集分段、四档分辨率（360/720/1440/3600）与三组极端尺度（1e-6、1e-3、1e4 与 1e3 偏置）。每个采样点都核对升程、角速度、角加速度、跃度、滚轮中心坐标、实际接触点、压力角、曲率与偏置因子，段界与 2π 闭合点不再跳过。实测最差误差：接触点 2.03e-12 mm、滚轮中心 2.03e-12 mm、压力角 1.86e-11°、曲率相对 1.59e-10、偏置因子 8.58e-13、速度/加速度/跃度相对 4.2e-14 / 5.7e-14 / 2.5e-14。

导出产物同样被回读：CSV 逐行与参考点比对（角度导数列、接触坐标、压力角、曲率），DXF 核对 AC1015、毫米声明、闭合标志、顶点数与坐标，SVG 核对根元素与折线点数。错误契约逐条触发 invalid_json / invalid_input / input_too_large，确认错误类别而不比对提示文字。

## 四后端之外的另一类独立：40 位十进制参考

上面两节都在 IEEE 双精度里算参考值，因此只能发现“代数写错”，发现不了“双精度本身在某处不够”。`tests/oracle_highprec.py` 补上这一层：用标准库 `decimal` 以 40 位有效数字重算同一几何，正弦、余弦、反正切与开方由脚本自身的级数与自变量约化实现，不引入第三方库；脚本开头把这些函数与 `math` 对照（最大差 5.0e-16），因此参考实现写错会先被自身检出，而不是变成对库的误告。

22 组算例、402 个点上，与 40 位参考的差按该算例该字段的最大值归一后为：接触点与滚轮中心 ≤8.7e-16、压力角 ≤1.9e-13、速度/加速度/跃度 ≤3.1e-14、曲率与偏置因子 ≤1.6e-12（曲率要除以 speed³，在 1e-3 量级的近似退化算例里被相消放大）。也就是说坐标实际上达到双精度可表达的极限，压力角与曲率仍有 12 位以上一致。

这份对照同时定位了一个可解释的精度损失：库内使用展开多项式，在段末 `u → 1` 处发生相消，4-5-6-7 的加速度相对损失约 2e-13（相对该规律峰值），速度约 5e-14。它不影响工程结论，但说明为什么本脚本按“该算例最大值”归一，而不是按局部值比较——按局部值比较会把相消误报成缺陷。

段接缝上的采样点不在本脚本范围内：接缝角度在双精度里比 40 位值低约 1e-17 弧度，参考会合法地归入相邻段，而跃度在接缝处本就跳变。接缝由 `oracle.py` 用同一套双精度角度覆盖。

## 采样极值的实测亏欠

最大值是采样值，因此本轮给出两侧区间而不是单点断言：报告值不能超过 32 倍细网格的上界，也不能低于同一网格的下界减去 `L·h/2`（`L = max|dα/dθ|`，`h` 为实测最大采样间隔）。该区间是保守的 Lipschitz 界；更有信息量的是实测亏欠：

| 分辨率 | 报告最大值 / ° | 32 倍参考最大值 / ° | 实测亏欠 / ° |
| --- | --- | --- | --- |
| 360 | 27.609335251 | 27.609490540 | 1.55e-4 |
| 1440 | 27.609335251 | 27.609490542 | 1.55e-4 |
| 3600 | 27.609451188 | 27.609491058 | 3.99e-5 |

360 与 1440 的报告值相同，是因为两种网格都包含同一个采样点，极值落在这个点上；换到 3600 才出现更接近连续的采样点。这说明采样极值会随网格对齐而“卡住”，不能用“加密后数值稳定”替代连续极值。该亏欠只对本算例成立，不是所有算例的误差上界；连续极值求解仍未实现。

## 随机性质测试

MoonBit 侧（`property_wbtest.mbt`，固定种子 xorshift32，四后端各跑一遍）检查结果之间的关系而不是快照数值：周期性与可重复性、统一缩放下的轮廓与角度不变性、只移动基圆/滚轮分配时的压力角不变性（说明零高只依赖基圆与滚轮之和）、基圆增大时最大压力角不增、转速按 ω/ω²/ω³ 缩放、压力角上限放宽只可能扩大接受、接触点到滚轮中心的距离恒等于滚轮半径、三种规律端点都满足 (0,0,0)→(1,0,0) 因而接缝连续、以及采样区间数落在 `[resolution, resolution + 段数]`。

JSON 契约侧（`tests/property.test.mjs`）补充接口层不变量：两次调用逐字节一致、摘要与点表一致、状态与交叉检查状态一致、CSV/DXF/SVG 形状与点表一致、搜索结果必须与按报告半径在 2 倍分辨率上直接分析的结果一致、错误码与字段定位，以及 1,500 例结构变异模糊测试（任意字段替换为 null/布尔/字符串/数组、删除字段、随机分辨率）始终返回结构化结果，且不出现未捕获异常或超时。

## 跨平台一致性

`tests/consistency.mjs` 在每台机器上对 5 组算例生成规范化清单：换行统一为 LF、键排序、数值统一为 15 位有效数字，然后对 JSON、CSV、DXF、SVG 与 CLI 落盘文件分别计算 SHA-256，并另存原始摘要以区分“逐字节相同”和“数值等价”。`tests/consistency.check.mjs` 汇总各平台清单并比对，摘要不一致时回落到数值差异报告（相对容差 1e-12）。CI 在 Ubuntu 与 Windows 分别生成清单，再由独立作业比对，两者不一致即失败。方法与边界见[跨平台一致性](跨平台一致性.md)。

DXF 测试用独立分组读取方式检查毫米声明、闭合标志、顶点数和坐标；CSV 测试检查行数、角度导数列与数值。新增 ezdxf 1.4.5 独立读取测试，3 组文件、18 个科学计数法坐标值均被接受，毫米声明、闭合标志和坐标核对通过。此结果不代表所有商业 CAD 软件均兼容，也未进行实体加工验证。

## 可复现命令

先安装 MoonBit、Node.js 22+。独立数值验证只需 Python 标准库，DXF 与浏览器验证需要开发依赖：

```sh
npm run toolchain:check
moon fmt --check
moon check --deny-warn --target all
moon info
moon test --target wasm
moon test --target wasm-gc
moon test --target js
moon test --target native
moon run examples/library --target wasm-gc
npm run build
npm run test:integration
npm run test:property
npm run docs:check
python tests/oracle.py
python tests/oracle_highprec.py
python -m pip install -r requirements-test.txt
python tests/dxf_interop.py
node tests/consistency.mjs
node tests/consistency.check.mjs artifacts/consistency
npm ci
npx playwright install chromium
npm run test:browser
npm run benchmark
```

程序将摘要写入 artifacts/oracle-summary.json，采样极值与区间写入 artifacts/oracle-convergence.json，跨平台清单写入 artifacts/consistency/。浏览器测试将截图写入 test-results/。文档截图为同一测试流程产生。

## 持续集成

`.github/workflows/ci.yml` 在 Ubuntu 与 Windows 两个干净检出上分别执行格式检查、严格检查（`--deny-warn --target all`）、JS 与 Wasm-GC 测试、纯库示例、构建、CLI 与导出测试、随机性质测试、独立数值验证、DXF 读取、演示与基准，并生成跨平台一致性清单；Ubuntu 额外执行 Wasm 与 Native 测试以及浏览器测试。独立作业收集两个平台的一致性清单并比对，不一致即失败，Pages 部署需要该作业通过。固定工具链为 `0.10.16+b1a0e846e`（从 .moonbit-version 读取）；生成的公共接口快照必须与提交内容一致；Windows 使用官方 PowerShell 安装脚本，避免 shell 与路径差异影响结论。实际状态以 GitHub Actions 对应提交的运行结果为准。

## 尚未验证的边界

连续极值、全局滚轮干涉、制造工艺、强度和载荷不在上述结果覆盖范围内。折线相切、共线与近退化已验证不会被误报为通过，但尚未通过精确算术分别分类。完整限制见算法说明。

固定验收编号与状态期望见[判定验收](判定验收.md)。文档、机器可读契约与公共 API 签名由同一 MoonBit 实现生成并经 CI 核对。
