# moon-ipp 工程与终审材料复核

复核日期：2026-10-25；交付版本：`liyun6666/moon-ipp@0.1.2`。

## 结论

**本次工程复核通过。** Windows 和 Linux 的严格检查、全部测试、构建、格式及独立 CUPS 互操作均通过；包已实际发布并由独立工程从注册表安装验证。本次发现的协议、输入、任务身份及资源边界问题均已修复。结论适用于下述版本、平台及测试范围，不能将有限测试等同于不存在任何缺陷的证明，也不替代主办方的资格审核。

- 有效 MoonBit 实现 **4,594 行**；计数排除空行、注释、测试、示例、生成接口、依赖、构建文件和自动化脚本。
- 发布代码提交：[`bfdb7c0fc13a39120fc18d0280840fc9d160abce`](https://github.com/liyun6666/moon-ipp/commit/bfdb7c0fc13a39120fc18d0280840fc9d160abce)。该提交时已有 **29 次实际提交**，超过至少十次有效提交的要求；本报告另作后续文档提交，没有空提交。
- [完整成功 CI 40167374982](https://github.com/liyun6666/moon-ipp/actions/runs/40167374982) 的 `verify`、`verify-windows` 两个任务均成功。失败的早期运行保留在 Actions 历史中。

## 已安装的官方技能与工具

从 [moonbitlang/skills](https://github.com/moonbitlang/skills/tree/8b9f1bad14bc62560dbe3537855379e561a4e066) 的实际默认分支 `master` 安装全部九个技能；复核时核实其 HEAD 为 `8b9f1bad14bc62560dbe3537855379e561a4e066`。本次使用安装后的 MoonBit agent guide 和 orientation 指南检查包结构、API、错误传播、边界、回归测试、脚本与生成接口。安装记录见 [moonbit-skills-source.json](evidence/moonbit-skills-source.json)。官方包不含赛事专用技能，比赛材料要求依据参赛者此前提供的活动正文核对。

本机 MoonBit 已升级到与 CI 相同的 stable：moon `0.1.20261023`、moonc `v0.10.17+d971670cd`；依赖固定为 `moonbitlang/async@0.22.5`。本机已安装 MSVC C++ Build Tools，配合现有 Windows SDK，通过脚本自动初始化开发环境，修复了此前只有 Linux native 能完成验证的环境缺口。

## 实际验证结果

| 检查 | Windows 本机及 CI | Linux CI |
| --- | --- | --- |
| wasm-gc 严格检查、测试 | 55/55 通过 | 55/55 通过 |
| JS 严格检查、测试 | 69/69 通过 | 69/69 通过 |
| 默认 native 严格检查、测试 | 74/74 通过 | 74/74 通过 |
| 默认 native 构建 | 通过，使用 MSVC | 通过 |
| 包与独立 `.mbtx` 格式检查 | 通过 | 包格式检查通过；脚本由 Windows CI 单独检查 |
| 实际 HTTP 测试 | 二进制往返、精确大小上限、超限、错误状态、错误类型、分块中途 EOF 通过 | 相同测试通过 |
| 独立 CUPS / ipptool | 不在 Windows 启动 CUPS | PDF、文本、预检拒绝、取消、分阶段提交、队列及 JSON 往返通过 |

新增固定种子测试遍历 **5,000 组**畸形或变异报文；拒绝非法输入时返回受控错误，成功解码的数据再次编解码保持一致，未触发 panic。测试不计入实现行数。此次没有用更新快照覆盖失败。

`moon info` 后检查根库、client、cli 的 `.mbti`：新工具链将 `Int` 规范化显示为 `Int32`，对该名称变化归一化后接口内容完全一致，没有删除接口或改变字段形状。

## 修复的问题及证据

| 问题 | 修复及回归覆盖 |
| --- | --- |
| 畸形 IPv6、DNS 标签及未转义路径被接受 | 校验压缩段、组数、十六进制与 IPv4 尾部、DNS 标签和路径字符；保留有效地址的解析往返 |
| Client 可将另一个 printer-uri 的请求发往自身端点 | 发送前核对规范化目标，拒绝时传输调用数为零；公开构造的端点在传输层重新校验 |
| 空文档、无效选项仍发起网络预检 | 在任何预检网络访问前验证输入，测试确认没有产生请求 |
| 构造对象可绕过重复属性、状态及版本校验 | 请求/响应校验属性集合与头部；拒绝未定义的 1.2、负状态及冲突目标 |
| 任务状态可用 Integer 或多值伪装，计数可为负 | 任务状态要求一个 Enumeration，计数要求一个非负 Integer；拒绝重复任务编号与歧义字段 |
| media-col 尺寸多值被静默取第一项 | 约束字段单值与类型，拒绝重复成员；同时支持规范允许的可读纸张名称 |
| MIME 大小写及参数被过度拒绝 | 解析带引号/转义的参数，比较参数名及 charset 时忽略大小写；其他参数值保持大小写含义 |
| 标准字符串未执行 UTF-8 字节上限 | 编解码共同校验 Text、Name、ASCII 等类型；验证中文多字节及边界长度 |
| 空属性组、JSON 字节串可消耗过多资源 | 编码、二进制及 JSON 输入均限制属性组，字节字段在分配前校验长度 |
| 扩展值标签被当作短标签读取 | 对尚未实现的扩展布局返回 Unsupported，避免错误解释后续字节 |
| Authorization 可包含控制字符 | 在建立连接前拒绝控制字符、非 ASCII 及全空白值 |
| 上游 HTTP chunk 中途 EOF 行为不正确 | 升级 async 0.22.5，使用真实 TCP 服务发送不完整分块；旧依赖测试失败，新依赖返回 ReaderClosed |
| 最新工具链及 Windows 换行导致 CI 失败 | 移除已废止的无参数 moon install，使用脚本 frontmatter，统一 `.mbtx` 为 LF，并保留全部格式检查 |

测试位置：[边界回归](../boundary_test.mbt)、[客户端回归](../client/client_wbtest.mbt)、[真实 HTTP 测试](../integration/transport_test.mbt)。协议依据：[RFC 8010](https://www.rfc-editor.org/rfc/rfc8010)、[RFC 8011](https://www.rfc-editor.org/rfc/rfc8011)；上游修复依据：[async 0.22.4 → 0.22.5](https://github.com/moonbitlang/async/compare/v0.22.4...v0.22.5)。

## 发布、安装与公开查重

`moon publish` 对打包及解包后的项目检查成功，发布返回 HTTP 200；注册表确认 **0.1.2、未撤回**，发布时间为 2026-10-25 06:00:10 UTC（北京时间 14:00:10）。独立消费工程实际下载 0.1.2，JS 严格检查及消费测试 **1/1** 通过，无本地路径依赖。下载包全部 **37 个 `.mbt` 文件**与发布代码提交一致，比较仅规范换行；见 [发布核验数据](evidence/release-verification-0.1.2.json)。

独立 CUPS 的原始命令、服务端日志、spool 和 ipptool 输出保存在成功 CI 的 artifact；PDF 与文本接收字节一致，不支持格式未入队，两个任务完成、一个取消，超过 1 MiB 文档的 JSON 往返成功。摘要见 [cups-result-0.1.2.json](evidence/cups-result-0.1.2.json)。这证明协议与接收行为，不宣称已完成实体打印机纸面质量验收或 IPP Everywhere 认证。

本次扫描 **3,276 个** Mooncakes 模块，结合 GitHub 三项查询，排除本项目后未发现提供对应 IPP 网络打印协议及任务管理的其他 MoonBit 实现。拼版、三维网格和文本 pretty-printer 项目与此功能不同。检索范围限于公开元数据及仓库索引；证据见 [公开查重数据](evidence/ecosystem-audit-2026-10-25.json)。

## 复现命令

在仓库根目录执行；Windows 需 MSVC C++ 工具及 Windows SDK：

```sh
moon run --deny-warn scripts/verify.mbtx
moon run --deny-warn scripts/verify.mbtx --run version
python scripts/count_source.py --minimum 4001
```

Ubuntu 安装 README 所列 CUPS / Avahi 系统依赖后执行 `python3 scripts/interop_cups.py`。原有计数和 CUPS 脚本继续保留；本次新增自动化使用 `.mbtx`。

## 终审材料及仍需确认的事项

项目命名、公开 GitHub 默认分支 main、实现规模、实际提交、README、许可证、示例、CI 和 Mooncakes 发布均有证据；申报草稿保持原有四段、30 行，覆盖通用性和三个完整场景，交付数据已更新。

工程修复不能替代以下确认：参赛者提供的活动正文要求人工撰写申报书，而现有文件为 AI 辅助草稿；此前材料列出的 9 月 24 日期限已经过去，尚未取得后续延期或当前受理资格的证明；同一核心作品是否曾通过 OSC2026 审核，参赛者此前回答“不确定”。这些事项不作已通过判断，也没有代填或提交报名问卷。

另有一项已知非致命告警：MSVC 编译上游 async 的 `internal/event_loop/fs.c` 时提示 EINVAL 宏重定义（C4005）。未修改依赖缓存、未屏蔽告警；构建及测试成功。这不是本项目 MoonBit 源码诊断，但因此不能宣称整个依赖链零告警。
