# 判定验收

本页定义当前需要保持的行为，用于发布前复查与后续回归；它不是连续轮廓安全证明。固定坐标与断言保存在 `acceptance_wbtest.mbt`，缩放/生成/复杂度案例保存在 `robust_topology_wbtest.mbt` 和 `topology_reference_wbtest.mbt`；G17～G19 的证据断言保存在 `evidence_wbtest.mbt`。

## 固定几何矩阵

| 编号 | 输入特征 | 预期拓扑 | 综合结果（局部条件通过时） |
| --- | --- | --- | --- |
| G01 | 闭合正方形 | complete，count=0 | accepted_sampled |
| G02 | 蝴蝶形严格交叉 | complete，count=1 | rejected |
| G03 | 非相邻边端点接触 | indeterminate，count=null | incomplete，不能通过 |
| G04 | 共线重叠 | indeterminate，count=null | incomplete，不能通过 |
| G05 | 近共线交叉、符号不可靠 | indeterminate，count=null | incomplete，不能通过 |
| G06 | 相邻边回折重叠 | indeterminate，count=null | incomplete，不能通过 |
| G07 | 连续重复点形成零长边 | failed，count=null | incomplete，不能通过 |
| G08 | 整条轮廓坍缩到一个点 | failed，count=null | incomplete，不能通过 |
| G09 | 有明显首尾缺口 | failed，count=null | incomplete，不能通过 |
| G10 | 相邻共线但同向前进 | complete，count=0 | accepted_sampled，不误报为重叠 |
| G11 | 首尾残差在局部跨度容差内 | complete，count=0 | accepted_sampled |
| G12 | 平移后细节低于 Double 可表达精度 | failed，count=null | incomplete，不恢复或猜测丢失细节 |
| G13 | 开口轮廓缩放至 1e-100～1e100，或平移至 1e15 | topology 和 checked_export 都拒绝未闭合输入 | 不因绝对坐标而放过缺口 |
| G14 | 归一化乘积接近/进入下溢范围 | 方向符号不确定 | 不以失真的符号证明无交叉 |
| G15 | 未检查、失败、不确定、交叉和局部拒绝的组合 | 仅局部通过且 Checked(0) 能接受 | 验证状态组合，未知不是零 |
| G16 | NaN、无穷、超范围坐标或实际点数越界 | 拓扑与 checked_export 均拒绝 | 不能生成通过结论 |
| G17 | 蝴蝶形严格交叉，以及相邻回折的对照输入 | 确定交叉证据指向边 0 与边 2；回折保留 adjacent_reversal 证据 | 证据对应实际边对，不虚构精确交点 |
| G18 | 71 边、步长 31 的星形折线，交叉数超过证据上限 | 总交叉数与独立二次参考一致，保留 32 组证据并标记截断 | 截断不改变总计数，所有证据的两条边号均有效且可定位 |
| G19 | 不确定回折轮廓，经报告编码输出 JSON | indeterminate，综合 incomplete；边起止位置与共享查询一致 | 不接受；证据只给边及端点，不输出声称精确交点的 intersection 字段 |

G01～G12 不只核对内核状态：还核对 finish_scan 的 sampled_feasible、Analysis::state 与 JSON 的 state/status/count。G03～G06 不绑定精确 uncertain_pairs 数量，只要求大于零且不接受，因为边对计数不等于唯一物理接触位置。

G17～G19 分别对应 `evidence_wbtest.mbt` 中同编号用例。接口集成测试另核对真实凸轮证据端点与点表一致、摘要输出仍包含证据；浏览器测试核对两条边高亮及重新计算后清除。它们不替代上述核心断言。

## 浮点环境限定

G05 使用接近 Double 舍入精度的坐标，G14 检查归一化乘积进入下溢风险区间时的保守过滤。这些用例固定的是当前工具链下应保持的安全行为，不构成任意编译器、硬件或浮点优化策略下逐位一致的保证。

当前验证使用 README 所列固定 MoonBit 工具链，在 JS、Wasm、Wasm-GC、Native 四后端执行。升级工具链，或改变浮点收缩、重排及次正规数处理策略时，必须重跑这些用例并核对误差过滤的假设；不能根据当前四后端通过就认定未来策略等价。符号无法可靠确定时应保守返回不确定，不得因舍入差异误报通过。验收不绑定不确定边对的精确数量，也不要求各后端所有浮点字段逐位相同。

## 范围与性能护栏

- 严格交叉在 1e-100、1e-7、1、1e100 尺度，以及相对尺度 1e6 的平移下保持可识别；不承诺无法表示的几何仍能保持结果。
- 固定种子生成的整数坐标轮廓与二次遍历参考实现比对确定交叉数；另有 60 组分析参数检查“接受 ⇒ 局部通过且确定零交叉”。
- 24,000 边的横窄、纵窄闭合轮廓均保持零交叉与零不确定，桶内访问数小于 2,400,000。
- 4,000 边恶意重叠轮廓达到访问预算后返回明确错误，不能降为零交叉。
- 实际点数、非有限坐标、超范围坐标与退化导出边界由已有健壮性测试覆盖。checked_export 允许用于诊断的闭合坍缩点数组，但拓扑仍拒绝它；导出不等于可行性认证。

## 接口验收

`contract_wbtest.mbt`、`evidence_wbtest.mbt`、`tests/api-contract.test.mjs` 与浏览器用例共同检查：

- 三层分辨率的最小值、最大值、越界与搜索复核关系。
- 每一种 ErrorCode 的 schema、线协议名称与退出码映射；未知码与未知结果状态按错误处理。
- segments[0].law、segments[0].lift_mm、search.intervals、search.upper_mm 等嵌套字段定位。
- 合法有限参数造成导数溢出时返回 calculation_failed，而非 invalid_input。
- 会话失败清空缓存、UTF-8 上限、选择性输出与兼容字段。
- 报告编码遇到非法边号、角度或不一致的诊断点号时，以类型化错误返回 internal_error 并保留具体原因，不依赖 unwrap panic；通过白盒注入损坏的内部结果验证，不宣称已发现合法输入能触发该情况。
- profile_crossings 仅对确定检查返回计数；不确定或检查失败均为 Err，不能解析错误字符串来分类。需要计数、不确定信息与证据时使用 crossing_report。
- 无 Worker 或运行中 Worker 失败进入兼容模式时，取消并禁用三档比较；即使脚本改写复选框，提交请求也不启用比较。兼容模式仍支持单档计算与导出，不承诺同步计算能被定时器强制中断。

## 可复现命令

```sh
moon fmt --check
moon check --deny-warn --target all
moon info
moon test --target js
moon test --target wasm
moon test --target wasm-gc
moon test --target native
npm run build
npm run test:integration
npm run docs:check
npm run test:browser
```

Python 独立数值验证与 DXF 读取方法见[验证记录](验证记录.md)。CI 以失败状态阻断回归；不以某次耗时或截图替代几何断言。
