Files
msgexchange-v2/docs/acm2-29-audit-and-simplification.md
T

124 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ACM2-29 完成度核查与简化计划
日期:2026-09-08。核查基线:`7c2d22e`,开始时工作区干净。
范围:Plane ACM2-29 正文及评论、当前生产代码、迁移、测试与全部顶层设计文档。
本文包含本次本地修正,不代表代码已提交、发布或现场验收。
后续工作:[ACM2-30](https://plane.chans.xyz/space/projects/0b5086dd-dd33-4893-86d6-9e716a21b21f/issues/eb647af8-b9a5-4417-aeb6-f9da4e1a3661),已创建在 Backlog,正文已读回核对。与 ACM2-29 的 relates_to 创建返回成功;关系查询接口报参数错误,未能独立读回复核关联。
## 1. 结论
**ACM2-29 没有全部完成。** PostgreSQL 存储重构内核大体落地,但真实快照链路、查询接口、
部分保真与恢复不变量、数据迁移验收及 Oracle 完整适配尚未完成。
正文仍要求“全宽表零子表”,2026-09-08 09:49 评论已撤销该方案;17:44 评论又称 P2–P4 全部完成。
应按修订后的 v2 目标核查,不再按已撤销的正文补做有损槽位,也不将收口评论当作证明。
**存在局部过度工程化,主要是边界重复和文档失真,不是表数量本身。**
一套关系库、显式清除、明细保真、事务、FIFO、outbox 和回填重试都有具体失败场景支撑。
再次推倒已落地的无损存储会增加迁移风险;优先减少重复表示、未使用分支和无效承诺。
## 2. 原计划完成度
| 工作 | 核查结论 | 代码或证据 |
|---|---|---|
| P0:CAS 消息身份、成功后回填隔离 | 部分完成 | SnapshotFlow 锁内 LAST_MESSAGE_ID/CAS 已实现;回填待办写入再次失败仍可冒泡到处理失败边界。 |
| P1:无损表、命令和唯一写入口 | 内核完成,边界未全验收 | V1.3.0、FlightStateEngine、persistNextStates9 张表/10 类集合。ROUT/ERUT、未知属性和空数组仍有缺口。 |
| P1DNLD + 一个 FLOP 纵向链 | GTDT 已有;真实 DNLD 未完成 | JacksonXmlCodec 的 SCHD body 为 nullStageResult.parser 默认 null,仅测试赋值;主泵先要求 Handler,生产只注册 GTDT。 |
| P2-1:双读对拍 | 历史工具工作存在,未证明现场对拍 | 2af71e8 曾有双读比较,7c2d22e 移除旧读路径;当前保留 FlightStoreDiffTool,未见真实输入逐字段等值报告。 |
| P2-2:权威读、展示视图、查询接口 | 仓储和视图完成,接口未完成 | V1.3.1、FlightSchdReadAssemblerInboxController 的 /all/flights 仍是 TODO。 |
| P2-3:回填持久补偿 | 有待办和扫描,但崩溃窗口未闭合 | BACKFILL_TODO 在外部回填失败之后才 record;提交后立即崩溃时没有待办;轮询入队不会重置终态。 |
| P2-4:带数据升级 | 脚本可执行已验证,无损升级未完成 | FlywayMigrationTest 显式确认 V1.2 删除集合数据;没有旧集合回填到明细的实现。 |
| P2-5:锁内读取及语义矩阵 | 快照内核完成;文档与代码仍有偏差 | 增量事件在锁外预览产生;矩阵原称文本 Clear、DELY 历史保留及明细 FK,代码并不支持这些陈述。 |
| P3-APostgreSQL 验收 | 现有套件全绿,不是完整协议矩阵 | 本次基线 100 测试、0 失败、0 跳过,含 16 JDBC + 2 迁移测试;“16 类”样例未覆盖 ERUT 与 ROUT 共存。 |
| P3-BOracle 11g | 未完成,不只是等待现场 | 仅两个 SQL 模板;无 DDL、驱动接入和完整绑定,其他仓储仍含 PG SQL。 |
| P4:旧列退场、索引与回退窗口 | 代码退场完成,运营验收证据不足 | V1.4.0 删除旧列及冗余索引;没有真实查询 EXPLAIN、备份恢复与现场回退窗口关闭证明。 |
| 32 个 Handler | 未完成,后续业务范围 | 当前只有 GtdtHandler 生产实现,其余不应因存储收口而视为已交付。 |
ACM2-29 当前为 In Progress,本次没有修改其状态、正文或发表评论。
## 3. 具体问题与优先级
### A. 本次已修:日期差删破坏保留航班明细
JdbcFlightSchdRepository.deleteDiffByDay 原先先按传入 FLID 无条件删除明细,再按 FDAY 删除主行。
输入包含跨日迁移或 FDAY=NULL 的航班时,主行保留、集合丢失,违反快照域化差删不变量。
本次先按 FDAY 选择实际删除成员,主表与明细使用同一范围;继续由主泵事务行锁保护。
没有增加表或修改已发布迁移。
新增真实 PG 测试同时覆盖目标日期删除、跨日成员保留、ADFT 无归属成员保留;
原实现测试失败,修正后通过。它揭示的是此前测试矩阵遗漏,而非原测试结果造假。
### B. P0:尚未闭合的正确性边界
1. **路线键冲突**V1.3.0 的 flight_route_point 主键只有 (FLID, ORDINAL)
replaceRoutes 对 ROUT/ERUT 各从 ordinal=1 写入,同航班共存时冲突。
通过新迁移改为 (FLID, ROUTE_KIND, ORDINAL),补真实 PG 往返与整事务回滚测试。
2. **补偿落账窗口**Pump/SnapshotFlow 的回填在业务提交后执行,失败才写待办;
record 再失败会逃逸到 MessageProcessor.processOne 的 INFRA 落账,可能降级已提交成功态。
将回填意图与终态同事务写入;成功回填后确认待办。覆盖提交后立即崩溃、待办写失败、重复及 DEAD 终态。
3. **落库和 wire 来源不同**GtdtHandler 锁外计算 preview/SchdPush,主泵锁内重新读态计算 nextState。
改为事务内一份 nextState 同时服务持久化与状态事件;保留独立 msg 通知意图的业务语义。
4. **“无损”不是全字段保证**parseCollection 可接受非对象数组元素;未知属性被存储列映射忽略;
Replace([]) 的 wire 与读回不同;异常对象局部替换可能残留旧列;文本 null 清除与文档曾不一致。
固定合法字段/形状及空值黄金样例,未知输入显式拒绝,避免成功后静默丢字段。
以上 B 项本次记录为后续工作,没有声称已修复。
### C. P1:真实能力和验收
- 接通真实 XML DNLD/RESP 的解析、整包验证与路由,补无匹配/迟到 RESP;不依赖测试全局 parser。
- 实现 /all/flights 兼容接口;按真实 wire 契约验证。
- findAll/findByFlids 当前每航班追加 10 次集合查询;批量加载并明确同一数据库快照,
在实际规模下记录查询数和执行计划,不添加无消费方的索引或缓存。
- V1.1→V1.4 带数据升级必须提供备份/可信输入恢复步骤和逐字段核对;
不能把“确认旧集合已经丢失”的迁移测试作为无损验收。
### D. Oracle 是完整实施项
Oracle11gDialect 没有生产调用方,snapshot MERGE 的插入列包括 4 个追踪/时间字段,
模板尾部却只生成 3 个占位符;现有 PG 绑定也无法复用。
还需完整 DDL、其他仓储 SQL、生成 ID、CLOB、空值、驱动/Flyway/JDK 组合及目标 11.2 集成测试。
现场环境只影响目标库实测,不应把尚未编写的适配代码归为外部阻塞。
## 4. 简化方案
| 保留 | 简化或延后 | 原因 |
|---|---|---|
| 单库事务、行锁、身份、outbox | 不新增双库镜像/分布式协调层 | 当前单写者范围足够,不解决假设的扩容问题。 |
| 主表 + 明细 | 不重回固定槽位,不重新设计整套存储 | 三门、重复资源、多次操作是已有契约数据。 |
| FlightNextState | 逐步消除 Handler 预览与主泵重复计算、字段集 JSON 往返 | 一条状态生成路径更容易证明 DB/wire 等值。 |
| 必要 Clear/Replace | 删除未使用的 snapshotReplace 命令解析参数;Apply 待真实协议调用方再决定 | 两种解析行为实际相同,Apply 又假设了未确认的定位唯一性。 |
| 数据库列映射 | 复用已有单一列清单;其余资源元数据按需要集中,避免再造注册框架 | 减少漂移而不新增架构层。 |
| 回填待办 | 一条持久队列覆盖中断恢复 | 用事务登记意图替代失败后记录和额外重启推断。 |
| 当前 PG 实现和既定 Oracle 目标 | 不继续堆未运行的通用方言模板 | SQL、绑定、DDL 必须作为可执行整体设计。 |
| 回归与对拍 | 保留可发现失败的矩阵;不为删空壳编写镜像测试 | 验收关注故障行为而非类数量。 |
本次已实施的小范围简化:读写复用 FlightSchdReadAssembler 列清单,删除
FlightDetailTables 未使用的集合清单和 hasAnyDetailRows 旧回退探测;移除 commandsFromFields
未使用的 snapshotReplace 参数及全部调用实参;更新误导的双写注释。
大范围模型、API、数据迁移和 Oracle 实施进入新 issue,避免将未验证的业务变更混入文档整理。
## 5. 下一批实施顺序与验收
1. **可靠性收口**:路线键、回填意图、DB/wire 单一状态、严格字段验证。
验收:真实 PG 的正常/失败/回滚/重放/空值矩阵全绿,成功终态不降级。
2. **最小真实链路**DNLD → GTDT → 完整查询 → outbox,并验证 RESP 守卫。
验收:实际 XML 输入,不手动赋值 StageResult.parser;真实存储和查询、事件契约一致。
3. **读模型与升级**:批量一致读取、实际查询计划、带数据恢复和对拍证据。
验收:查询次数按批次有界,集合/源序号/顺序保真,备份恢复有演练记录。
4. **Oracle 完整适配**:按既定部署边界实现并单独验收,不借 PG 绿灯替代。
验收:目标 11.2 上新建/升级、DML、并发锁、事务恢复及字符语义通过。
每一步交付时同步对应设计及完成证据。32 Handler 扩展、阶段 B 和生产运维仍按原业务工作项推进,
本 issue 不承诺一次完成所有产品功能。不以类已存在、迁移成功或合并提交代替功能/发布验收。
## 6. 本次验证与文档整理
- 基线 ./gradlew test100 测试,0 失败,0 跳过。
- 新差删测试在原实现失败;修正后 ./gradlew test101 测试,0 失败,0 跳过,
包括 17 JDBC 与 2 Flyway 测试,Testcontainers 提供真实 PostgreSQL。
- 未连接 Oracle,未验证现场部署、生产负载或历史数据恢复。
- 重写航班设计为当前实现基线;历史决策归档,有效决策缩为摘要;
同步 architecture/design/user-stories/semantics/README,旧评审明确标为历史。
- 新 [文档入口](README.md) 规定各文件唯一职责,后续不再维护多份阶段完成清单。