# MoonCDC 0.3.9 工具链迁移与复验记录（2026-11-09）

本次版本为 0.3.9，包含工具链和依赖迁移，并面向重新验收再次执行已有完整验证。历史发布包的工具链与依赖记录不受本次升级影响；本记录不代表赛事官方验收结果。

使用官方稳定通道安装包并核对官方 SHA256 后，默认工具链统一为：

- `moonc v0.10.20+65efd5b93`，编译器构建日期 2026-11-05。
- `moon` / `moonrun 0.1.20261104 (940aa18)`，构建日期 2026-11-04。
- 辅助运行环境沿用 Node.js 26.5.1、Python 3.12.13；本地 Python SQLite 为 3.53.2。
- MoonBit 依赖升级为 `moonbit-community/sqlite3@0.2.4`、`moonbitlang/async@0.22.7`、`moonbitlang/x@0.5.7`；绑定内置 SQLite 仍为 3.49.1。

迁移采用新版 `#derive(...)` 属性。JSONL 和 SQL 扫描器的视图偏移均由输入扫描确定，使用明确的原始 UTF-16 视图 API，保留原有代码单元和有界扫描语义。生成接口的差异为派生属性位置、显式 `Int32` 和 `core/json` 类型限定；现有业务函数、捕获格式和 wire 格式保持不变。

在 Windows 本地重新执行 `python scripts/verify.py` 全部通过，进程退出码为 0：

- 格式、严格编译、原生构建和接口生成。
- 原生 90/90，JavaScript 20/20，wasm-gc 20/20。
- 独立 SQLite/CLI 集成，包括并发快照交接及持久化恢复。
- 5,134 个有限 REAL 样本的独立位级比较，覆盖 `1e300`、次正规数和持续更新。
- 200 次外部提交、两个同步任务与并发日志清理。
- 128 列、旧函数参数上限、命名空间保护、部分提交及外键动作边界。
- COMMIT 锁失败回滚，以及目标提交前、目标提交后确认前的真实进程终止恢复。
- 接近默认事件预算的大 BLOB 经 JSONL 导出、导入、确认、重放及审计。

当前统计口径下有效生产 MoonBit 代码为 5,068 行。该变化主要来自新版属性布局，不作为新增功能工作量。

CI 已固定到相同工具链构建；远程 Windows/Linux 结果应核对本版本提交对应的 [GitHub Actions](https://github.com/tlhuecdkoyg/MoonCDC/actions/workflows/ci.yml)，不能用旧版本的绿灯代替。

## 上次验收问题的针对性检查

`scripts/real_regression.py` 先由独立 Python SQLite 连接写入 `1e300` 和 `-1e300`，分别通过直接、JSON、JSONL 三条快照路径初始化目标；随后只修改 `note` 列，保持 REAL 原值不变，再执行增量同步。每次以 Python `struct.pack` 和 SQLite `typeof` 比较源/目标的完整位模式与存储类型。上述过程及后续连续更新、删除、重放全部通过，覆盖上次反馈的数值变化及 before-image 冲突。

本轮有界源码复查未发现新的 REAL 或提交/确认恢复阻塞。快照水位与消费者登记仍位于同一源事务，目标行和游标仍原子提交，确认落后仍按目标持久化位置恢复；过滤后为空的批次仍推进原始区间。未为复验更改这些状态机。

## 重新验收时的运行条件

- 使用本版本的源码/发布包与上述固定工具链，从 README 的临时示例开始复现，不混用旧 CLI。
- 若保留的是 0.1.0 捕获，按 [使用手册](OPERATIONS.md#upgrading-from-010-to-020)建立新捕获代际、可信快照和目标；已丢失的精度不能由升级恢复。完整 0.2.0/0.3.0/0.3.1 捕获先执行 `upgrade-capture`；符合当前结构要求的 0.3.2–0.3.8 捕获沿用既有格式。
- 外部写入连接启用 `recursive_triggers=ON`、`trusted_schema=ON`，并遵守 README 的表结构、触发器、外键和 UTF-8 限制。
- 数据库 REAL 的正负零统一为 `+0.0`；非零有限 REAL 保留 binary64 位模式。行级最终一致同步不等于保留任意源事务分组，也不承诺跨库事务原子性或断电持久性。
