# moon-ipp 0.2.0 实用工作流复核

日期：2026-10-27。本轮在现有已可运行的 IPP 实现上补齐实际接入流程，不增加文档转换、硬件驱动或后台自动重试范围。

## 完善内容

1. **提交前计划**：`plan` 读取真实输入文件，查询能力并报告选项、字节数、健康状态及诊断；不会执行 Print-Job、Create-Job 或 Validate-Job。错误计划返回非零退出码。
2. **提交后凭据**：`print --wait --output NEW.json` 在联网前独占建立凭据，取得任务编号即保存，再跟踪终态。更新使用同目录临时文件、文件同步和替换；已有凭据与冲突临时文件不会覆盖。
3. **失败和恢复**：保留 accepted/completed/canceled/aborted/tracking-error/outcome-unknown 等明确状态。已接受任务通过 job/wait 继续查询；未确认结果不自动重发。
4. **修复实际接入缺陷**：外部包原来不能实现文档承诺可注入的 Transport，现改为 `pub(open)` 并由外部包的测试实现验证。CLI wait 原来会把取消/中止作为成功退出，现输出观察记录后返回失败。

本地凭据不是设备端幂等键。删除或换一个路径仍可能重复提交；断电后目录元数据的持久性依赖文件系统，不能把文件同步描述为跨主机事务保证。凭据不会保存文档内容或认证头。

## 验证

- wasm-gc 78/78、JS 107/107、Windows native 114/114；严格检查、构建、格式、MSVC 兼容探针通过。
- 测试覆盖计划仅查询能力、无效长度在联网前失败、已有凭据拒绝复用、原子更新不覆盖冲突临时文件、丢失提交响应不重发、取消/中止失败、跟踪超时及取消任务后仍保留已接受编号。
- 新增独立 CUPS 工作流脚本，检查 plan 不入队、错误格式计划失败、一次命令打印并等待、保存凭据与 stdout 一致、复用凭据不产生新任务、取消后的 wait 非零退出和文档字节一致；远程结果全部通过，见下文和工作流结果文件。
- 公开接口有意扩展：Client.plan、开放 Transport、Command.Plan、Arguments.wait。原有 print 无新增参数时仍返回原任务 JSON；使用穷尽枚举匹配或手工构造 Arguments 的调用方需适配。
- 有效实现 5,151 行，排除测试、示例、生成接口、构建脚本及依赖。统计见 `evidence/source-count-0.2.0.json`。

首轮 Linux 并发测试还复现了异步 stderr 同时写入引发的运行时中止。进度输出现由 Mutex 串行化，仍保留并发测试；没有通过关闭测试并发掩盖问题。CI 也更新为已核实使用 Node 24 的 checkout/upload-artifact 版本，移除 Node 20 运行时弃用提示。

后续 Windows JS 测试暴露计时器回调延迟可能让超期响应先返回的问题。新增主动阻塞事件循环的确定性回归，修复前失败；客户端现在在计时器之外核对收到和校验响应后的截止时间。查询返回 RequestTimedOut，提交类操作仍按 SubmissionUncertain 处理，不因超时自动重发。

## 远程验证与发布

- 发布源码：`dfb984458d311c0b0b5d2b2b97bb3ef19582cf53`。[成功 CI 40427150535](https://github.com/liyun6666/moon-ipp/actions/runs/40427150535) 的 Windows/Linux 任务均通过：wasm-gc 78/78、JS 107/107、native 114/114，含检查、构建、格式及 MSVC 兼容探针。
- 独立 CUPS 既有打印、取消、分阶段提交、队列、ipptool、字节及大 JSON 验证通过；空结束请求也通过。新增实用工作流全部通过：[工作流结果](evidence/cups-workflow-result-0.2.0.json)，原始命令和服务端日志在同一 CI 的 artifact。
- 实际 `moon publish` 检查打包/解包工程成功，发布 HTTP 200。注册表确认 **0.2.0**、未撤回，时间 2026-10-27 00:35:27 UTC（北京时间 08:35:27）。[Mooncakes](https://mooncakes.io/docs/liyun6666/moon-ipp)、[GitHub Release](https://github.com/liyun6666/moon-ipp/releases/tag/v0.2.0)。
- 独立消费工程从注册表下载，严格检查与测试 **2/2** 通过，验证 codec/client API、外部 Transport 实现和 Client.plan 只查询能力；全部 **49 个代码和构建支持文件**与发布源码一致，见[发布核验](evidence/release-verification-0.2.0.json)。异步消费测试需直接声明/导入 moonbitlang/async，README 已补齐。
- 后续文档提交不改变发布代码。Linux GCC 仍对第三方 async 线程池中的 write 返回值发出 unused-result 告警，已保留原始日志；没有通过关闭 C/MoonBit 诊断隐藏它。该上游 C 告警不等于本项目测试或构建失败。

具体操作、恢复查询和认证方法见 [使用指南](使用指南.md)。本轮没有对实体打印机发起任务，也没有提交赛事表单。当前证据证明协议与工作流可复现，不替代目标实体设备的格式、纸面输出及认证验收。
