# dialnumber：2026 年十月黑客松最终验收材料

项目：[sssssurf/dialnumber](https://github.com/sssssurf/dialnumber)。参赛者：粟瑞峰。
阶段：已通过报名初审；本页提交最终验收成果，初审通过不归因于 10 月 27 日的后续修改。
当前交付版本：0.8.1。主办方最终验收结论尚待确认。

## 验收依据

核对日期：2026-10-27。
十月截止日期采用[十月官网](https://moonbitlang.github.io/Hackathon2026/)当前公告：2026-10-31。
技术交付清单采用官网链接的[赛事章程 §5.1“阶段三：项目验收”](https://bxup9uklfcb.feishu.cn/wiki/Dx4Bwd6D1i3GfHkajQCcF7SznEd)。
章程部分时间文字仍为九月，因此不沿用其中的旧日期。

| 验收事项（概述） | 实现或材料 | 自检方式 |
| --- | --- | --- |
| MoonBit 主体实现、模块职责清楚 | parse / pattern / region / valid / format / tel_uri / match / asyoutype；运行库无第三方包依赖 | moon.mod、moon.pkg、源码 |
| 公开且可追溯的仓库 | 10 月 8 日起的真实功能、测试、数据与文档提交；保留历史 | git log --reverse |
| 完成申报核心能力 | 245 地区、九个非地理网络、两级校验、格式化、号码比较、实时格式化、上下文解析 | 下方范围表、632 项测试 |
| 安装、使用与演示可复现 | README、examples/basic、cmd/demo 与 CLI；输入和预期输出随库提供 | node scripts/acceptance.mjs |
| CI 检查/构建/测试 | GitHub Actions 验证生成文件、源码、四后端、演示与基准 | .github/workflows/ci.yml |
| 至少一个实际示例 | examples/basic 经公开 API 调用已实现能力，无私有函数或测试白盒依赖 | moon run --target js examples/basic |
| 核心路径与异常输入测试 | 单元、性质、健壮性、元数据、两套独立参考数据；保留并解释差异 | moon test |
| Mooncakes 可安装交付 | sssssurf/dialnumber；发布及独立消费者验证结果见 acceptance-status.md | moon view sssssurf/dialnumber@0.8.1 --json |
| 开源许可证与来源 | Apache-2.0；数据和验证工具的来源、变换、版本及许可证记录 | LICENSE、THIRD_PARTY_NOTICES.md |

官网另强调 AI 使用须可解释。本文与[开发回顾](development-retrospective.md)记录设计取舍、生成数据与手写逻辑的区别，以及 AI 参与范围；不以生成文件行数或测试数量代替工程价值。

## 三个完整使用场景

1. **注册与通讯录录入**：用户输入国内号码并指定地区 → parse 得到 PhoneNumber → 分别检查 possible 与 valid → 输出 E.164 或国内显示；AsYouType 逐键展示。例：GB 的 020 7946 0958 → +442079460958。
2. **联系人比较与清洗**：解析两种写法 → is_number_match 区分完整、NSN、短 NSN 或不匹配；不同显式国家码及冲突分机不混同。例：+1 与 +44 的相同本地数字为 NoMatch。
3. **电话链接与国际服务号码**：parse_tel_uri_full 保留上下文和参数 → 使用明确的公开编号计划约定或显式 authority 回调求解 → 校验并格式化；+800 等网络不归入任意国家，地区标记为 001。

## 范围与质量证据

| 范围 | 证据 |
| --- | --- |
| 245 地区规则与 25 个 NANP 地区 | plan_data.mbt、plan_examples_test.mbt、nanp_test.mbt |
| 九个非地理网络及长度边界 | non_geo_data.mbt、non_geo.mbt；独立正反例语料 |
| 无回溯模式引擎 | pattern.mbt；模式性质、畸形模式及 2,264 条规则差异语料 |
| 号码比较与分机 | match.mbt、match_test.mbt；Google 原版 isNumberMatch 对照 |
| 逐键格式化与数字保留 | asyoutype.mbt、asyoutype_test.mbt；两套逐键期望 |
| RFC 3966 上下文 | tel_uri.mbt、context_plan_test.mbt；任意长上下文不被忽略或盲拼 |
| 2,299 条 JS 独立输入 | compatibility.md；15 条案例、30 个字段的已知差异均保留 |
| 原版 Google Java 9.0.17 | google-compatibility.md；17 个号码流程、6 个比较、6 个输入序列；13 处中间布局差异明确保留 |

国别元数据只判断规则范围，不证明号码存在、可达或属于某人。少数 nationalPrefixTransformRule 改写和完整交互编辑行为不在当前交付范围；详见 [known-limitations.md](known-limitations.md)。

## 复现入口

安装 MoonBit 和 Node.js 18+ 后，从仓库根目录运行：

    node scripts/acceptance.mjs

Linux/macOS 的 native 构建还需 C 编译器。Windows 没有 C 编译器时先运行：

    node scripts/acceptance.mjs --targets js,wasm,wasm-gc

脚本生成 .cache/acceptance/report.json 和每步日志，检查生成文件、构建与测试、真实演示、公开 API 示例、基准及可发布包；任一步失败返回非零。脚本不修改官方表单、不发布包、不联系组委会。

## 本期新增工作

原始项目在 10 月 8 日建立。10 月提交逐步引入模式引擎、全地区数据与生成器、NANP、RFC 3966、非地理网络、号码比较与实时格式化。
10 月 27 日继续修复比较和前缀/长度/上下文边界，增加固定参考数据、可复现检查与完整交付材料。新增内容与历史工作均可通过提交逐条核对，未重写历史或制造空提交。

验收阅读入口为本页；[项目说明](../项目申报书.md)保留目标与范围，[开发回顾](development-retrospective.md)说明技术理解。公开仓库和 Mooncakes 发布是交付成果；“自检通过”与“组委会正式验收通过”分别记录。
