windyboy
8093d20f9b
docs(acm2-63): 收敛文档口径并补齐作业健康指标登记
...
含:MAFL 派生投影与 SRVT/VIPF 无界集合口径、schd EVENT_ID 写代次与 DEAD 代次替换、运营日时区 fail-fast、缺口索引增删(G-MAFL/G-SRVT-VIPF/G-COMPAT-HTTP/G-REQ-OPEN-UNIQUE,移除 G-JOB-HEARTBEAT)、job 心跳/扫描积压/最近失败指标登记、INV-18 验证映射改为实际测试名。
2026-09-12 21:00:01 +08:00
windyboy
8631ec0b20
docs(agents): 改写为角色、工作流与项目约束约定
2026-09-12 21:00:01 +08:00
windyboy
799243b0a8
fix(ingress): diagnose missing shared mailbox generated key
...
共享信箱 insertRaw 取不到 CMINMSGS_ID 时抛出可诊断错误,指明该列必须由库方生成(C-14、Q7);只改适配代码,不动共享 Schema。
2026-09-12 20:56:41 +08:00
windyboy
267eb20219
feat(jobs): expose last job failure time
...
JobActivity 记录最近失败时刻并进入快照;JobRunner 失败时上报该时刻;新增指标 msgx.pipeline.job.last_failure_age_seconds 与健康明细 lastFailureAgeSeconds(对齐 reference 作业健康口径)。
验证:./gradlew test 145 tests / 0 fail / 0 skipped。
2026-09-12 20:56:41 +08:00
windyboy
8a380c7646
refactor(config): drop system-time defaults from domain and entry points
...
删除会被误用的系统时间默认值:MsgEvent.createdAt、ProcState.updatedAt、InboxPoller.pollOnce(now)、HistorySweepJob.run(now)、Identity.of(day)。Identity 的日期边界改由 MessageProcessor 按 PARAM:msgx.operation-day.zone 算出后传入(边界关闭时身份值不变);StubProcState/StubInbox 改注入 Clock(测试可传假时钟),全部调用点显式传时间。
验证:./gradlew test 145 tests / 0 fail / 0 skipped。
2026-09-12 20:56:41 +08:00
windyboy
ebe81d8665
fix(processing): stamp outbox events from the injected clock
...
所有生产 MsgEvent 构造点显式传 createdAt:ScheduleProcessor.snapshotEvents、FdelProcessor 删除事件、eventsFor(新增 createdAt 参数,三个调用点传注入时钟)、HistorySweepJob.tombstone(传 run 的 now)。领域默认保留给测试便利,但生产写入不再依赖系统时钟。
验证:./gradlew test 145 tests / 0 fail / 0 skipped。
2026-09-12 20:52:24 +08:00
windyboy
4b71b5bb09
feat(jobs): expose job heartbeat and scan backlog
...
新增 JobActivity 持有作业心跳与扫描积压,JobRunner 每轮 tick 上报(失败只计数、不刷新心跳),PipelineMetrics 注册 msgx.pipeline.job.heartbeat_age_seconds / ticks.total / failures.total / last_sweep_selected,新增 JobRunnerHealthIndicator(未启动 UP 并标 started=false;已启动但心跳缺失或超过 3×扫描周期 DOWN)。对应 reference 作业健康段与 [G-JOB-HEARTBEAT]。
验证:./gradlew test 145 tests / 0 fail / 0 skipped(新增 JobRunnerTest 2、JobRunnerHealthIndicatorTest 4、PipelineMetrics 指标注册 1)。
2026-09-12 20:52:24 +08:00
windyboy
ab18e4ec3f
test(jobs): verify purge rollback on real postgres
...
新增 HistorySweepPurgePgTest(Testcontainers 本地 PG):归档确认后删除阶段注入失败,验证同事务登记的 tombstone 随事务回滚、当前态保留(INV-17/INV-18)。
2026-09-12 20:45:41 +08:00
windyboy
15c035182f
test(delivery): verify schd upsert on real postgres
...
新增 JdbcMsgEventUpsertPgTest(Testcontainers 本地 PG):单行只进不退、旧版本被拒、同版本 tombstone 胜出且不可复活、条件确认旧代次 0 行/当前代次 1 行、DEAD 行被更高代次替换后单行 PENDING 且错误清空。此前该 SQL 无任何执行覆盖。
2026-09-12 20:45:41 +08:00
windyboy
5beb67dadb
fix(ingress): preserve compat receipt semantics
...
接收结果边界改为 insertRaw 是否返回 ID:接收时间读取失败回退注入 Clock 并留痕,PG insertIfAbsent 失败只记日志与 pgEnqueueFailures 计数,不再冒泡成 HTTP 失败(避免客户端重试多写信箱行)。缺的 PROC_STATE 由收报轮询按 US-01 补建且只建一条(INV-1),入口高 ID 仍等水位追平(INV-4)。
验证:./gradlew test 135 tests / 0 fail / 0 skipped(新增 InboxServiceTest 4 例:读时间失败+入队失败仍返回同一 ID、接收时间 NULL 回退时钟、真实插入失败仍失败且无伪造 ID、轮询对失败入队补建且仅一条)。
2026-09-12 20:43:11 +08:00
windyboy
46e901fd44
fix(jobs): recheck archived flight version before purge
...
HistorySweepJob 归档成功后进 PIPELINE_LOCK 事务,按 (FLID, STATE_VERSION) 用同一判据复查,仍合格才登记 tombstone 并删除;purgeArchived 改收候选而非裸 FLID 列表,并带 (flid, state_version) 删除守卫。事件与删除同事务提交或回滚(INV-17、INV-18)。
验证:./gradlew test 131 tests / 0 fail(新增「归档后主泵更新同一 FLID → 不删、不发 tombstone」用例)。tombstone 与删除的回滚原子性依赖真实 PG 事务,本机无 Docker 时无法执行。
2026-09-12 20:40:32 +08:00
windyboy
592079055f
fix(delivery): drop redundant schd event index
...
V9 追加删除已无消费者的 idx_evt_flid(读端不再按 (PARTITION_KEY, STATE_VERSION) 合并),并在最终 schema 断言其不存在;新增用例覆盖 schd DEAD 行被更高合法代次替换为单行 PENDING、错误字段清空、旧代次不得复活。
验证:./gradlew test 130 tests / 0 fail。
2026-09-12 20:39:15 +08:00
windyboy
d21555091f
fix(delivery): upsert latest schedule event
...
KAFKA:schd 收敛为每 FLID 单行:V9 先按 (STATE_VERSION DESC, EVENT_ID DESC) 收敛存量再建部分唯一索引 uq_schd_event;写入走带谓词的单行 upsert(只进不退、同版本 tombstone 优先、接受新代次即换 EVENT_ID 并重置 PENDING/清旧错误);读取不再 DISTINCT ON;成功确认改按 (EVENT_ID, STATE_VERSION, PENDING) 条件更新,删除 Dispatcher superseded 清理循环。msg 路径不变。
验证:全量 ./gradlew test 129 tests / 0 fail(新增 3 个用例:单行只进不退、同版本 tombstone 不可复活、发送期间新代次保持 PENDING)。V9 的存量收敛/索引与 upsert SQL 需真实 PG,本机无 Docker 时 FlywayMigrationTest 跳过。
2026-09-12 20:38:18 +08:00
windyboy
21739a439d
fix(infra): enforce one open request
...
新增 V8 部分唯一索引 uq_req_open:(REQ_TYPE, OPERATION_DAY, SENDER) 仅在 PENDING/SENT 唯一;建索引前用 DO 块检测存量重复组并以带业务键的异常中止迁移,禁止静默删数据。保留 idx_req_open 服务含关闭态的查询;不引入运行时协调器(归 US-08)。
验证:全量 ./gradlew test 126 tests / 0 fail;索引与拒绝第二条开放请求的断言在 FlywayMigrationTest(需真实 PG,本机无 Docker 时按既有 assumeTrue 跳过)。
2026-09-12 20:35:58 +08:00
windyboy
9554b1aae8
fix(config): fail fast on invalid operation-day zone
...
运营日时区只认 PARAM:msgx.operation-day.zone:JobRunner、HistorySweepJob、JdbcSnapshotLogRepository.purgeBefore 改走注入的 OperationDayProps;ScheduleProcessor/AdftProcessor 删除「非法值回退字面量」;新增 @Context 启动自检 OperationDayZoneCheck,配置错位在启动时暴露。
验证:./gradlew test 126 tests / 0 fail(新增 OperationDayPropsTest 覆盖合法解析与非法即失败)。
2026-09-12 20:34:56 +08:00
windyboy
3f2a1be75b
chore(processing): remove stale backfill comment
...
BackfillService.attempt 前仍声称「处理完立刻试一次、调用方是主泵」,与类注释及「回填一律扫描驱动」矛盾;删除过时 inline KDoc,保留 @param 说明,运行时代码不变。
2026-09-12 20:32:52 +08:00
windyboy
a89755c200
fix(processing): clear replay error state
...
人工重放把 FAILED/DEAD 拨回 PENDING 时,与 attempts/next_attempt_at 一起清空 error_class 与 last_error,使活动状态不携带上一轮失败结论;identity_key、白名单与 MessageLifecycleGate 不变。
同语句同时改 JDBC 与内存实现,避免两套行为漂移。验证:ReplayServiceTest 3/0、InboxLifecycleJdbcSqlTest 8/0(H2 真实 SQL)。
2026-09-12 20:32:27 +08:00
windyboy
eb103d6244
refactor(processing): remove unused processing start field
...
processing_started_at 没有任何判据消费(终态只看尝试上限),删除字段、仓储接口与方法、主泵写入、重放清理、SELECT/映射与 H2 fixture,并新增 V7 DROP COLUMN;V1–V6 历史迁移不动。
验证:./gradlew test 123 tests / 0 fail;V7 的 DROP 与最终 schema 断言需真实 PG,本机无 Docker 时 FlywayMigrationTest 按既有 assumeTrue 跳过。
2026-09-12 20:31:23 +08:00
windyboy
161914eeb8
fix(processing): keep exhausted failures terminal
...
ProcFailure.fail 在 markTerminal 后继续执行 update(FAILED),把 DEAD(EXHAUSTED) 覆写回非终态。改为耗尽分支写完终态即返回,保持 INV-6 终态不可逆与 INV-8 回填意图同语句。
回归:ProcFailureTest 覆盖临界次数保持 DEAD、不可回退 FAILED,以及非耗尽退避。
2026-09-12 20:29:23 +08:00
windyboy
3085431bea
docs: 落地上轮复审修正并修正参考表位置
...
- G-IGNORE 缺口表述去掉错引 INV-19、补 US-04
- reference 登记 msgx.pipeline.backfill-scan-period
- user-stories 的 R_keep 下界/deadline 措辞对齐
- reference 归档参数行从空行后挪回参数表内(修正 acm2-52 提交中的表格位置)
2026-09-12 11:36:52 +08:00
windyboy
dcdc5117bf
docs(acm2-51): 收口 D10/D14/D15
...
- D10 投递保序:architecture 改为 FLID 级(与 design/CLM-7 对齐,实现收敛归 ACM2-34)
- D14 REQ_TRACK 状态名:user-stories US-08 对齐实现的 PENDING/SENT/DONE/EXPIRED
- D15 容量假设:invariants 新增 CLM-10(未实测,含解除条件),design §10 加指针
纯文档,不改代码/迁移/配置/legacy。
2026-09-12 11:33:58 +08:00
windyboy
69c2cf219f
docs(acm2-52): 修正跨文档事实冲突 F1–F9 与错引编号
...
- F1/F6 HTTP 契约:C-28 目标 ResponseDto + 请求体上限暂定 10MB,Q3 指向 C-28
- F2 legacy 与 SIS 的优先级限定;F3 超期判据对齐 ENQUEUED_AT;F4 改引 D1
- F5 参数默认值改引 reference/PARAM;F7 补 4 条契约状态词;F8 定义 MAID/MAFL 并明确排除共享航班;F9 补 INV-20
- N1/N2 错配编号改引;N3 迁移链指针;N4/M5 白名单补 D-x/OPS-x;N6 补 INV-16/17 映射;N7 加粗规则
- M1 回填退避事实与论证;M2 Q6/Q7;M4 Q4 假定标注;M7 去复述
纯文档,不改代码/迁移/配置/legacy。
2026-09-12 09:57:26 +08:00
windyboy
817236ca26
fix(processing): 落地 D1/D5/D6 三项裁决,删除 head-deadline 参数
...
D5(终态判据只保留尝试上限):
- Pump.tick 内联 attempts 判定,删除 head-deadline 相关的毒丸分支与滞留告警代码
- 删除配置项 head-deadline(PipelineProps / application.yml)与 PumpDeadlineTest
- PROCESSING_STARTED_AT 变为只写,注释如实说明当前无判据消费它
D1(回填放弃判据改为时间):
- 暂时性故障在 R 之前只退避重试,不再按尝试次数放弃;到 R 才放弃并记 TRANSIENT_DEADLINE
- backfill-max-attempts 降级为单行重试的告警阈值
D6(超期判据改用本地入队时间):
- 新增 V6 迁移:PROC_STATE 加 ENQUEUED_AT(回填存量后置为非空 + 默认)
- findBackfillDue 的谓词与 overdue 标记改比较 enqueued_at,不再用库方时钟的 received_at
- BackfillDue 增加 overdue;收报与兼容入口显式写入本地入队时间
文档同步:
- 清理 4 处 message-lifecycle.md 章节号死链(Pump/InboxService/PipelineProps/application.yml)
- 关闭 G-HEAD-DEADLINE、G-BACKFILL-ABANDON-BYTIME、G-ENQUEUED-AT 三条缺口登记
- reference/user-stories/README 与实现对齐
验证:./gradlew test ⇒ 122 tests, 0 failures, 1 skipped
Refs: ACM2-45
2026-09-11 20:44:30 +08:00
windyboy
6eade95a97
docs: 拆分契约/前提/参数文档,合并消息生命周期并收敛设计裁决
...
- design.md 合并 message-lifecycle.md(后者保留跳转 stub),去重并改用稳定 ID 引用
- 新增 invariants.md(前提/不变量/声明边界/验证映射)、contracts.md(对外条款与 Q 台账)、
reference.md(参数/指标/模块/错误分类)
- architecture/flight-state/user-stories/README 同步重划引用;README 废止「引用章节号」
- 裁决收敛:R 按超期而非次数放弃、清除前提含放弃清单、航班表写者互斥、head-deadline 仅告警、
超期判据用本地入队时间、投递批次读取时刻冻结、schd 只进不退与条件标记、FLID 复用为前提
- 删除 runbooks 与 CI 防漂移校验:设计阶段不产出面向执行期的产物
Refs: ACM2-42..51
2026-09-11 15:48:14 +08:00
windyboy
632a5fe422
docs: 精简重复论证与过时流程表述,口径与实现双向对齐
2026-09-11 14:26:44 +08:00
windyboy
a84751bf03
fix(jobs): 留痕清理独立接通历史存储开关;精简死逻辑并对齐陈旧注释
2026-09-11 14:26:44 +08:00
windyboy
d909a88167
fix(codec): 解码映射失败产出 CODEC_ERROR,落实退避重试与可重放白名单
2026-09-11 14:25:42 +08:00
windyboy
fed0b5df26
docs: 同步取报-处理-回填链路的修复结论
...
- 事务边界表:区分业务型/非业务型终态;回填改为扫描驱动(主泵不再 inline 回填)
- 符号与配置:补 delivery-batch / backfill-max-attempts / cutover-watermark /
late-detect-* / backlog-cache-ttl-ms / 邮箱超时与指标口径
- 闭环状态:G2/G3/G9 标记已修;G1 标注「阶段 0 只读迟到检测已交付」
- 修正 R/R_keep 论证:R 不保护重放窗口;原文保留归 R_keep 与 Q7/Q9,
并删除「由 SIS Expiry 推导提交时延」的无效推论
- 回填语义补全:四种结果、放弃 ≠ 标记已确认、公平轮转与饥饿说明
- 兼容入口与水位:登记行超出水位、水位追平前不被领取,并写明运维含义
Plane: ACM2-35 ACM2-37 ACM2-38 ACM2-39 ACM2-41
2026-09-11 08:08:39 +08:00
windyboy
1e75a81107
fix(pipeline): 修复取报-处理-回填链路的超时、吞吐、回填与 FIFO 问题
...
外部调用(ACM2-33)
- 共享 MySQL 与自有 PG 全部补有界超时:驱动 connect/socket 超时 + Hikari 池超时
(注意 Micronaut 的 Hikari 项是毫秒数,不是 Duration 字面量)
- 删除主泵/毒丸路径的 inline 回填:跨库写不再占用 FIFO 关键路径,回填统一由扫描驱动
- 游标自愈:save() 改为「先 UPDATE、缺行 INSERT」,缺行只记一次 ERROR
- Pump/Dispatcher 外层 catch 补 error 日志与失败计数
投递吞吐(ACM2-34)
- Dispatcher 改批量领取;队头退避未到期或首条发送失败即停止本轮(保持目标内保序)
- 有活不再 sleep;删除不可达的 state==SENT 死条件;markSent 移入分支;
superseded 清理加轮数上限与空 eventId 保护
回填闭环(ACM2-36,V4)
- MISSING(运行时确认行不存在)立即放弃自动重试并告警;暂时性故障达上限后停止自动重试
- 新增 reopen 人工恢复入口;放弃 ≠ 标记已确认(BACKFILL_AT 仍为空,清除前提不成立)
- 扫描改 (BACKFILL_ATTEMPTS, MSG_ID) 公平轮转并排除放弃行,消除全局回填饥饿
- V4 只加字段与必要索引,不按年龄做任何存量推断
切流播种(ACM2-35,V5)
- cutover-watermark 四模式(min/zero/max/显式 ID),默认不播种、代码不做默认选择
- 升级实例拒绝重新播种(SEEDED_AT 为 NULL ≠ 从未消费);播种与水位同语句落库
- 非法取值由启动自检挡下
错误分类与入口契约(ACM2-37)
- 未知 SCHD 子类型改为 UNSUPPORTED,不再静默当全量日计划合并
- ADFT 运营日冲突改走 ProtocolViolation → DEAD(PROTOCOL)
- 兼容入口 receivedAt 缺失回退到注入 Clock;MessageLifecycleGate 强制注入 + 装配断言
- FIFO:主泵只领取 msgId ≤ W,兼容入口登记的行在水位追平前不被领取
时间源与可观测(ACM2-38 / ACM2-41 阶段 0)
- 仓储/处理器/作业全部经注入 Clock;移除 markTerminal/markBackfilled 的 Instant.now() 默认值
- 退避表档位与 max-attempts 对齐并加启动自检
- Micrometer 7 个 gauge(@Context 急切注册)+ /health 与 /metrics 共用积压快照缓存
- 只读迟到检测:监视被放行的空洞 ID 是否后来真的出现,只计数告警、不补入队
Plane: ACM2-33 ACM2-34 ACM2-35 ACM2-36 ACM2-37 ACM2-38 ACM2-41
Tests: 88 → 120(1 skipped 需真实 PG)
2026-09-11 08:08:35 +08:00
windyboy
b65728f312
refactor(ingress): 信箱连续上界遍历改用解构
...
contiguousUpTo 由 row.msgId 改为 for ((msgId, _) in rows);MailboxRow 是 data class,
取值结果相同,行为不变,无配置与迁移影响。
验证:./gradlew test 通过。
2026-09-10 21:03:04 +08:00
windyboy
50e0e7f389
docs: 修复跨文档冲突与外部规范口径
...
不动代码、配置与迁移,只收敛文档口径。
- 登记两项外部冲突:Q13 日计划缺失可选字段(SIS §3.16 注释 4 要求删除本地值,
与现行"未携带字段保留"相反)、Q14 主/共享删除顺序与 EROR 回报义务
(SIS §1.6.1-1.d / §4.8);航班级"缺席不删"补 SIS §3.16 注释 1 依据。
- flight-state §3.3 补主/共享关联按 FLID 值比较的规则。
- message-lifecycle:§11 水位不变量与 §5.1 空洞老化自洽;删除过期的 updatedAt
判据,统一为 PROCESSING_STARTED_AT + 可注入 Clock;§5.1/§6 补 SIS 480 分钟
Expiry 与 legacy 1 天保留窗,作为 Q2/Q6/Q7 的取值参照。
- architecture/design:明细表口径统一为 8 张资源明细表 + FLIGHT_ROUTE_POINT;
Oracle 11g 断言收敛为待适配验证;配置键按 application.yml 实际名称加 msgx. 前缀。
- user-stories:Q2/Q6/Q11 补外部锚点并收窄 Q11 到重置周期 + SNDR 值域;
新增 Q13/Q14 并挂入 US-05/06/08 前置;五个独立事实改为引用 message-lifecycle §1。
- README/legacy:文档基线改为代码基线 eea1120 + git log 指引;补"外部协议冲突以
SIS 为准"的维护规则;修正 /all/flights 过滤措辞;术语统一为「回填意图」。
验证:文档间章节引用 0 缺失、markdown 0 断链、SIS 引用小节全部存在、
Q1–Q14 正文与 Q 表双向可解析、代码块配对正常。
2026-09-10 20:54:01 +08:00
windyboy
eea11203a2
fix(processing): 收紧消息生命周期与投递约束
2026-09-10 20:39:22 +08:00
windyboy
dd839e6abb
docs: 统一生命周期与处理职责口径
2026-09-10 19:48:49 +08:00
windyboy
9fdb5ba6a5
chore: 纳入 agent 工具配置与忽略规则
...
.gitignore:忽略 agents.state.json、.openagentpack/versions/ 与 .env——
后两者分别是工具运行状态和本地环境变量文件,都不应进版本库。
agents.yaml:agent 工具(bailian provider,qwen3.8-max)的配置。
密钥走 ${DASHSCOPE_API_KEY} / ${BAILIAN_BASE_URL} 环境变量占位,文件内不含明文凭据。
与本次信箱生命周期重构无关,单独提交以便回退。
2026-09-10 11:15:49 +08:00
windyboy
1183c7522b
docs(kdoc): 其余模块注释统一为直白说明
...
把上一提交没覆盖到的模块也改完,至此仓库内不再有"只写编号、不写说明"的注释。
涉及 33 个文件(生产 24 + 测试 9),包括航班状态模型与合并引擎、事件与留痕模型、
运营日计算、投递器、历史归档作业、编解码与身份、重试与重放、健康指示器、
生命周期装配、以及各自的测试类。
改法与前面一致:先说这段代码做什么,再说为什么这么做,术语第一次出现就地解释
(FLID、OPERATION_DAY、航班版本号、删除通知、待发事件表等)。工单编号
(U07/N02/ACM2-10 之类)已全部移除;段落编号只剩 10 处,全部带文件名位于句尾,
用作延伸阅读,例如"见 docs/flight-state.md §5"。
保留了本来就自解释的行内注释、PgTestSupport 顶部的环境变量默认值表格,
以及 InboxController 里描述待补接口的 TODO。
校验:逐文件做"去注释后比对"(块注释 + 行注释清除、空白归一),33 个文件代码
零差异;另做逐行非注释代码比对,同样零差异。clean test 为 78 passed / 1 skipped。
2026-09-10 11:14:11 +08:00
windyboy
6e7d819034
docs(kdoc): V2 迁移与处理/持久化层剩余注释改为直白说明
...
接上一提交,把本次工作范围内还没改到的注释补齐:V2 迁移脚本的注释原文几乎全是
段落编号引用,处理层与持久化层还留着一批 `(§3.3/§5)` 形式的行内注释。
V2__inbox_lifecycle.sql:文件头改为先讲清这次迁移解决的三个问题(记住收报读到哪里、
回填记录并进 PROC_STATE 而不是单开一张表、记下收信时间做什么用),再落到每个字段;
字段级注释补上"这个值非空代表什么"。SQL 语句一字未动(已用去注释后比对确认)。
processing:Pump 的分派与终态注释、ScheduleProcessor 的重放判定与运营日冲突、
DynamicProcessors 的删除通知与重新激活,都改成说明白"这一步在做什么、为什么这么做"。
infra/persistence:Repositories.kt 的仓储约定、航班状态读写、待发事件与请求跟踪接口,
JdbcPgRepositories 的锁、整态合并、历史清理判据、明细表映射,StubRepositories 的
对应实现,一律先说清用途再谈规则。
测试:8 个测试类里的行内引用改为说明这条断言在守什么。
注释里保留的文档指向只在需要延伸阅读时出现,不再作为解释本身。
全部为注释改动,测试仍为 78 passed / 1 skipped。
2026-09-10 11:09:19 +08:00
windyboy
d475feb790
docs(kdoc): 重写信箱生命周期相关 KDoc,改为直白说明并去掉内部编号
...
原有注释大量引用 §5.1/§5.2/Q2/US-01 这类文档编号和内部简称,跳过了"这段代码在做什么、
为什么这么做",没有读过设计文档的人基本读不懂。本次统一改成先讲清这件事本身、
再说为什么要这样做,编号只在末尾留一处指路。
覆盖本次改动涉及的 24 个 Kotlin 文件(生产 16 个 + 测试 8 个):
- 领域与端口:ProcState(补齐全量字段说明与状态/错误分类逐项注释)、
ProcStateRepository / InboxCursorRepository / CminmsgInboxRepository 及
MailboxRow / BackfillDue / Backlog;
- 收报:InboxPoller(把"水位连续、遇缺口停下、缺口老化"用大白话讲透)、
InboxService、JdbcCminmsgInboxRepository;
- 处理:Pump / MessageProcessor、ScheduleProcessor、DynamicProcessors、
ProcFailure、JdbcProcStateRepository 与游标实现;
- 回填与观测:BackfillService、InboxLifecycleHealthIndicator、JobRunner;
- 配置与 stub:PipelineProps(三个新增参数说清取值理由)、MailboxProps、
StubRepositories;
- 测试:8 个测试类改为"这些用例在守哪几条规矩",并保留 H2 不覆盖
ON CONFLICT 的说明。
术语统一按第一次出现就地解释:水位、处理标记、回填、死信、队头、终态。
纯注释改动;除拆分枚举时按仓库风格补的两个行尾逗号外无代码变更
(已用剥离注释后比对 HEAD 的方式逐文件核对)。测试仍为 78 passed / 1 skipped。
2026-09-10 11:05:55 +08:00
windyboy
8c6bb83b62
docs: 同步信箱生命周期实现口径——§4 缺口收敛、水位空洞老化、回填事实并入 PROC_STATE
...
message-lifecycle.md:§4 两个崩溃窗口随"终态与回填意图同体同行"消除(不再是缺口,改为
说明剩余未闭环项是回填跨库单写期间的持续失败);§5.1 补空洞老化规则(自增回滚空位会使
水位永久停摆,超出最大提交时延即判永久并放行,只跳过空洞不越过已存在的行);§5.2 补判据
机制(不依赖独立待办表,R 覆盖退避);§3 表格改回填意图与"到期或已达 NOW − R"。
design.md:§2.1 表以 INBOX_CURSOR 取代 BACKFILL_TODO、PROC_STATE 责任补回填事实;
§3.1 收报改为按 ID 区间扫描且不以标记为谓词;§3.3 终态由处理器事务内落库、死信同样可
补写;§6.1 维护作业改为 BackfillService.sweep;§7 补 max-commit-delay/overdue-backfill/
backfill-batch 与 mailbox.processed-value;§8 验证表补"终态未回填不得阻断发现"与"意图随
事务回滚";§9 入口表更新;§10 缺口两则改写为现状与待确认项。
architecture.md:§4 主流程第 1/3/4 步与 §3 存储表同步(水位、回填意图、单事务范围)。
flight-state.md:§2 对象表同步。user-stories.md:US-01/US-09 当前基础与落点改为实现现状、
Q2 口径改为"老化阈值待库方书面承诺"。
2026-09-10 11:00:02 +08:00
windyboy
09b53c77bb
refactor(ingress): 信箱边界层契约重构——发现与处理标记解耦、回填事实并入 PROC_STATE
...
收报扫描不再以 DATE_PROCESSED 为谓词:终态而未回填的行(解码失败死信等)会永久占据
有限批次,累积到 claim-batch 后收报整体停摆(US-01 条目 3 / message-lifecycle §5.3)。
ingress/InboxPoller.kt:按 ID 区间升序有界读取(ID > W),水位落 INBOX_CURSOR 并与入队
同一 PG 事务推进(中断后重扫补建);遇空洞即停,空洞超过 pipeline.max-commit-delay 判定
为永久并放行——否则水位永久停摆于一次自增回滚留下的空位。删除 InboxEnqueue(改由
insertIfAbsent 幂等入队)与 poller 内的回填扫描(消除 ingress→jobs 反向依赖)。
infra/persistence:端口按事实重画为 readRange/maxId/markProcessedIfUnmarked,标记 UPDATE
带 DATE_PROCESSED IS NULL 守卫,只把空标写为已处理(§11 单调,重复执行无副作用)。
回填事实并入 PROC_STATE(RECEIVED_AT/BACKFILL_AT/NEXT_AT/ATTEMPTS/ERROR),BACKFILL_TODO
随 V2 迁移下线;终态与回填意图是同一条 UPDATE,由处理器在自己的业务事务内落库,
message-lifecycle §4 登记的两个崩溃窗口(提交后回填前崩溃、待办二次落账失败)不再是缺口。
processing/BackfillService.kt(取代 BackfillSweepJob):终态提交后立即尝试一次,失败按
30s→15min 指数退避重试;扫描条件「终态 + 未确认标记 +(已到期 或 接收时间早于 NOW − R)」
使 §5.2 的超期期限 R 覆盖退避,中间态永不补写。死信同样可补写——回填只需消息 ID,
不再依赖 META。Pump 改用可注入 Clock。
infra/health:InboxLifecycleHealthIndicator 输出积压条数、最老未处理信龄、未回填终态数与
水位滞后(OPS-2 / §5.3 验收)。预计消化时长需吞吐采样,留待接入指标注册表时补。
配置:pipeline.max-commit-delay / overdue-backfill / backfill-batch、mailbox.processed-value
(Q2/Q6/Q7 未书面确认前取保守初值,不得为提速下调)。
不变量回归测试:死信不阻断后续发现、水位遇空洞即停与老化放行、终态+意图同事务、
超期 R 覆盖退避、中间态不补写、标记单调;InboxLifecycleJdbcSqlTest 以 H2 的 PostgreSQL
兼容模式直连验证上述 SQL 语义(不依赖 docker)。libs.h2 由 testRuntimeOnly 提为
testImplementation 以支持该用例。
验证:gradle clean test --offline → 78 tests / 0 failures / 1 skipped
(PG Testcontainers 集成用例在本机无 docker 时按既有约定 assumeTrue 跳过)。
2026-09-10 10:59:58 +08:00
windyboy
ffd3abd655
docs: message-lifecycle 审查修正——消解跨文档冲突、口径归口并登记 Q12
...
message-lifecycle.md:
- §5.3 日计划改为现行合并语义(缺席不删、缺失保留,引 flight-state §3.1),类型粒度统一 TYPE-STYP
- §5.1 明确两条扫描路径按 ID 区间取行、不以处理标记为谓词;水位定义与 Q2 绑定
- §4 两个缺口改与 design §10 同措辞;§5.2 的 R 构成挂 Q6/Q9,新增 Q12 积压跳过授权
- §6 方案 B 对账补“只补缺失行、标记单调不回退”;删除能力声明标注待 Q9 确认
- §7 改为“尚未实现”、统一 COUTMSGS_* 列名;§11 ID 不断链改为条件式不变量
user-stories.md:US-11 第 4 条限定为“本系统不写共享历史表/不清除外部信箱”;US-01 扫描谓词指向 lifecycle §5.1;US-01/09/11 前置补口径指针;新增 Q12;OPS-2 补积压与最老未处理信龄;Q10 列名统一。
architecture.md:共享 MySQL 红线限定主体;§6 中断恢复表改为指向 message-lifecycle §4;收报步骤补扫描谓词指针。
design.md:水位定义、回填死信处理、维护作业、归档、缺口恢复统一指向 message-lifecycle。
README.md:核对日期更新至 2026-09-10(代码基线 99a0f5f,文档基线 328bbf8);维护规则补规范类文档一档。
2026-09-10 09:00:53 +08:00
windyboy
328bbf88d2
docs: 新增 message-lifecycle.md——上游消息生命周期唯一规范(五事实/崩溃恢复/水位/超期补写/历史积压/信箱清除 A/B/出站契约),登记 Q9/Q10/Q11,README 索引与 architecture/design 指针补齐
2026-09-10 08:55:43 +08:00
windyboy
8068ed975b
docs: 文档整理——统一 KAFKA 事件名与运营日术语,链接文字对齐标题,修复两处空行格式,README 补旧行为基线索引;主/共享级联语义上移至 flight-state §3.3 并增补 STATE_VERSION 不变量(architecture §9 引用同步改为 §3.1/§4/§7)
2026-09-10 08:16:31 +08:00
windyboy
99a0f5f738
refactor(flight-state): SCHD 日计划收敛为缺失保留合并语义并对齐现行设计文档
...
按现行 docs/flight-state.md(111 行版,§1-§7)全面对齐 domain 包及其消费方,
删除整套指向已退役长版文档(§5.x-§10)的引用与死代码:
- 语义:FlightStateEngine.snapshotState 由"完整快照整体替换"改为 §3.1 合并语义
——出现 Set/Replace、缺失保留、标量空串显式清空;DELETED 不被日计划恢复(§3.3)。
- 校验:validateMessage 移除从未接线的报文覆盖范围(scope)参数,只保留 §4 步骤 2
的声明数量/航班标识/运营日推导校验;ScheduleBody 删除 scopeStart/scopeEnd。
- 删除死代码:domain/Decision.kt、FlightModel 的 SnapshotPatch/UpsertOutcome、
ProcState.isTerminal/archivable、SnapshotFlag.SEQN_REGRESSION、
ScheduleRecord.seqn(及 wire FlightRecordXml.SEQN);codec 移除未消费 FFID。
- 删除未接线且引用已退役列(fday/last_message_id)的 SqlDialect 方言脚手架,
oracle11g README 改为按 V1 现列重建的口径。
- 注释/测试:domain、processing、infra 仓储与 jobs/delivery、配置类及对应测试的
KDoc 章节引用全部对齐现行 flight-state.md/design.md;FlightStateEngineTest
重写为合并语义(62/62 通过)。
V1__flight_state_baseline.sql 保留原样(内容注释仍带旧章节号,改动会破坏
已应用迁移的 Flyway checksum,待重建基线或 V2 净迁移时收敛)。
2026-09-09 22:17:04 +08:00
windyboy
b75f566276
docs: 按代码现状收敛 architecture/design/user-stories 口径并对齐 flight-state 口吻
...
- design.md:删除已退场 PUMP_JOB/Handler/Decision 等引用,改按 ScheduleProcessor 与
DynamicProcessors 实际分派描述;补 PROTOCOL 错误类与 RESP 守卫缺口;实现入口与 §10
差异清单按 HEAD 代码重写
- architecture.md:修正悬空章节引用;关键决策删减为仍具约束价值的 4 条并连续编号 D1–D4,
补当前状态列
- user-stories.md:逐条更新 US 当前基础与落点,清理已不存在的文件与旧叙事,Handler 术语统一
- README.md:实现核对日期更新至 2026-09-09(基线 d53a0a1)
flight-state.md 与 docs/legacy/ 保持原样。
2026-09-09 21:50:05 +08:00
windyboy
d53a0a1c2f
docs: remove retired schedule generation design
2026-09-09 20:22:10 +08:00
windyboy
f6f9d6c6cb
fix(codec): make XML annotation targets explicit
2026-09-09 19:53:37 +08:00
windyboy
c688f08337
build(kotlin): stabilize annotation targets
2026-09-09 19:50:33 +08:00
windyboy
3ed54d306e
refactor(codec): map SIS XML through annotated DTOs
2026-09-09 19:48:45 +08:00
windyboy
c2d4a76e3e
docs: flight-state 定稿唯一设计规范,移除 §10–§12 并落地评审修正 A–M (ACM2-31)
2026-09-09 19:28:14 +08:00
windyboy
879d658159
refactor(flight-state): 按 flight-state.md 审计定稿全量重构脚手架与 SQL (ACM2-31)
...
- SQL 基线 V1__flight_state_baseline.sql 整体取代 V1.0.0–V1.4.0:
PIPELINE_LOCK/PROC_STATE/MSG_EVENT/REQ_TRACK/BACKFILL_TODO/FLIGHT_SCHD
+ 8 张资源明细表 + FLIGHT_ROUTE_POINT + SCHD_SNAP_LOG 留痕层
- 废除 FDAY 日代/SCHD_GEN/名单差删:OPERATION_DAY 不可变(应用层校验 +
条件更新强化 §7.4),STATE 仅 ACTIVE/DELETED,物理清除只在历史归档后
- 处理器化:applyScheduleRecords(§5.1 七步同一事务,重放判定/整包
DEAD(PROTOCOL)/归属冲突不落地)+ FLOP/FDEL/ADFT(tombstone 仅
ACTIVE→DELETED,重复 FDEL 幂等不推进版本)
- 投递:KAFKA_SCHD 同 FLID 按最新 STATE_VERSION 合并,被压掉事件关闭,
TOMBSTONE 发 null 值消息(键缺失=删除旧值 §7.3)
- 回填待办改为业务事务内预登记,消除提交后写待办的崩溃窗口(§7.2/§10)
- XML 解码改为 jackson-dataformat-xml 数据类直接映射(SIS 信封强类型,
FLTR 开放标签泛型承载)
- 历史归档/物理清除顺序不可颠倒:归档确认成功集才物理删除,未接通删 0 条
- 移除 PUMP_JOB 队列/ReferenceService/FlightStoreDiffTool 等旧机制与测试,
新增运营日/引擎/快照/FDEL/归档顺序不变性回归测试
2026-09-09 17:53:08 +08:00
windyboy
6af292d103
docs(flight-state): 移除对账账本并按三轮评审收敛删除与时序语义 (ACM2-31)
2026-09-09 15:40:54 +08:00
windyboy
9e434d6486
docs(flight-state): 重写当前态设计为简洁版并落定航班身份模型 (ACM2-32)
...
按评审意见重写 docs/flight-state.md(603 → 332 行),去掉堆叠的补充说明,每条规则只保留一处:
身份模型:
- FLID 由 AODB 分配、与运营日绑定;同一 FLNO 不同运营日 = 不同 FLID
- OPERATION_DAY 一经确定不可变,跨日归属不符属协议异常(整包拒绝)
- 延误跨日不是迁移:同一 FLID、运营日不变,由 FLOP 继续更新
- 补齐 FDEL 删除入口(§2、§6.2):按 FLID 删除并移出名单,不换代
- 代码共享与过站关联分离;物理列名 FDAY 统一改称 OPERATION_DAY
快照与差删:
- 11 步事务固定顺序;差删集合即 O − N,OPERATION_DAY = D 为删除前断言
- 覆盖范围按“是否单个完整运营日”判定:48 小时窗口只覆盖状态、不差删
- 完整快照字段缺失即清除(SIS §3.16 注释 2/4),只对本模块映射字段生效
- SEQN 仅用于同会话顺序观测,不启用陈旧拦截
其余:留痕 RESULT/FLAGS 分列、身份不变量六条、保留期默认 7/90/7 天、
未定事项与 SIS 规范依据各收进一张表(§10)。
2026-09-09 14:54:54 +08:00
windyboy
2b112f527c
docs: consolidate flight state design
2026-09-09 11:43:34 +08:00
windyboy
4449ee5dcc
docs(flight-state): 按 2026-09-09 二轮评审修正设计文档,开放项锚定 ACM2-31 (ACM2-31)
...
依据 ACM2-31 二轮外部评审逐条修正,待协议确认项已对照 SIS_AODB_RMS V0.1 佐证:
- 标注约定:区分规范要求与现状/未决披露,杜绝混作依据
- 航班身份:FLID≠航班号,FDEL+ADFT 换名时 FLID 可能不同(规范 §3.18),代码共享独立事件经 MAID/TAID 关联
- FDAY 三日期概念区分(业务日期/快照覆盖日期/名单归属日期);跨日归属回迁列为未决(§3.3 约束 4)
- 规则 M 补成立条件标注(快照生成时点 + 投递顺序前提未逐条核实)
- 差删完整性前提引协议口径:单包不分段、RECS 记录数、完整快照注释(§3.16.1)
- 动态线集合全量/增量语义待逐类确认(CHOT CSNO 实为机位序号 §3.22.2),Replace 全集仅对快照线定案
- tombstone 澄清为自定义删除事件(非 Kafka 原生墓碑),删除版本/世代缺口开放
- 行锁表述纠正(跨实例同样生效,但不实现认领/选主/切换/FIFO);Oracle 空串=NULL 为既定行为,验证目标改为字段语义保真
- ACTT 实际时间口径(进港 ATA/出港 ATD §3.20),修正示例字段名;FLOP 29 类改为规范 §3.19–3.43 实数;99 上限标注协议出处
- 语言修订:主泵/数据一致性比对/JSON 数组/整态替换措辞等;错误矩阵每类错误单一默认路径
- 开放项(回迁防护/动态集合语义/删除世代/幂等键/FIFO 参数/一致性读/TAOP 语义核对等)归集 ACM2-31
2026-09-09 10:47:03 +08:00
windyboy
bb81deae0a
docs: 航班状态设计重写为当前基线,按请求/下载与动态两条线讲清状态变更 (ACM2-30)
2026-09-08 18:50:34 +08:00
windyboy
1fc2b2c895
fix(persistence): 差删先按 FDAY 圈定删除成员,修复保留航班明细误删 (ACM2-30)
2026-09-08 18:50:02 +08:00
windyboy
7c2d22e8f1
feat(persistence)!: V1.4.0 退场 legacy 槽位存储,persistNextStates 成为唯一写路径 (ACM2-29 P4)
...
- V1.4.0 迁移:DROP FLIGHT_SCHD 全部 77 个槽位/里程碑/紧凑航路列(V1.3.0 起
零写入、P2-2 起零读取)+ 三个与 PK 前缀冗余的 (flid) 单列索引;回退窗口关闭
(对拍留档:P2-1 FS7 v2 双读差异记录)
- 接口收敛:FlightSchdRepository 删除 upsertSnapshotBatch/upsertIncremental,
删除废弃 FlightStateRepository 及 Jdbc/Stub 适配器;仓储与装配器删除全部
legacy flatten/slot/milestone/route 视图代码,ALL_COLUMNS 收敛为无损承载列
- FS7 对拍工具移除 diffDualRead(legacy 槽位基准退场);diff() 对 legacy
FLTR JSON 比对保留;FlightStoreDualReadTest 随工具移除
- 测试种子统一走 v2 写路径(support/SeedHelpers),GuardedFlightSchd 简化
- docs/decision-flight-state.md:头部复核入口更新 + 新增 §10 v2 落地终态索引,
§1–§9 保留为历史记录
验证:MSGX_PG_PORT=5433 真实 PG 全量 100 用例 0 失败 0 跳过;无环境变量
Testcontainers 全新容器 V1.0.0→V1.4.0 迁移链 18/18 全绿
2026-09-08 17:44:20 +08:00
windyboy
107be5d74a
feat(infra): 数据库方言接缝 SqlDialect(PG 实装 + 11g MERGE 编译级交付)(ACM2-29 P3-B)
...
- SqlDialect 接口:快照 upsert / 主行存在性保障两类方言敏感 SQL;
PostgreSqlDialect 承接现有 ON CONFLICT 路径,JdbcFlightSchdRepository 已接入
- Oracle11gDialect:MERGE INTO 模板(编译级交付,未经目标库验证)——激活门控
写入 KDoc:11.2 补丁 × JDK25 × ojdbc × Flyway(oracle11g location) × 连接池
组合现场实测通过才允许切换,MERGE 绑定顺序适配随激活完成
- db/migration/oracle11g/README.md:11g 迁移位置占位与前置条件清单(CLOB 映射、
空串=NULL 语义回归、display 视图 11g 版)
验证:MSGX_PG_PORT=5433 真实 PG 全量 108 用例 0 失败 0 跳过
2026-09-08 17:10:40 +08:00
windyboy
35c91c67b9
test(integration): JDBC 集成测试 Testcontainers 兜底 + 全结构回环矩阵 (ACM2-29 P3-A)
...
- PgTestSupport 三级解析:MSGX_PG_* 显式环境变量 → Testcontainers 自动起
postgres:17-alpine 隔离容器(JVM 单例复用,docker 不可用才跳过)→ assumeTrue
绝不误报通过;解决了「本机端口被占/无库则集成测试静默跳过」的验收假绿问题
- loadCollections 只输出非空属性(缺失键语义),write→read 线格式一致
- 新增 readAfterWrite 矩阵用例:16 类结构(多行/重复资源号/非连续源序号/异常
前缀列/文本旁列)persist → findNextStateByFlid 深度等值 + wire(nextState) ==
wire(readAfterWrite) 双断言(评审 F5 持久化侧+线格式侧闭环)
验证:MSGX_PG_PORT=5433 外接库 108 用例全绿;无环境变量 Testcontainers
自动容器路径 18/18 全绿
2026-09-08 16:00:26 +08:00
windyboy
06a1081bdd
test(migration): 带数据 V1.1→最新升级链验证 + DELY Apply 拒绝 (ACM2-29 P2-4)
...
- FlywayMigrationTest 新增升级链用例:隔离 schema 迁至 V1.1.0、写入含
*_TXT 的存量行、一路升级到最新——断言标量数据存活、v2 追踪列默认就位、
display 视图/backfill_todo/明细表可用、*_TXT 列按已知损失边界消失(评审 F6:
升级前必须导出或重放,测试固化该边界)
- L2 收尾:DELY 无协议序号属性(DLNO 非法)——SEQ_ATTR 移除 DELY,Apply 对
DELY fail fast 拒绝(语义矩阵 §2 同步口径)
- 级联回归已在 P2-2 落地(deleteByFlids/deleteDiffByDay 明细级联断言)
验证:MSGX_PG_PORT=5433 真实 PG 全量 107 用例 0 失败 0 跳过
2026-09-08 15:54:50 +08:00
windyboy
20aafb9ab0
feat(processing): 快照流程锁内复核收敛 + 异常显式清除语义 + 语义矩阵定稿 (ACM2-29 P2-5/M3)
...
- SnapshotFlow 收敛到 v2 §5 事务顺序:锁外仅解析校验;取得 PIPELINE_LOCK 后
锁内复核快照身份(last_message_id 重放短路)→ 锁内读代与当前航班态 →
计算 nextState → 写入 → CAS → 事件 → SUCCEEDED。锁内 CAS 失败属数据异常,
一律回滚 FAILED(INFRA),删除「版本号相同即视为重放」的推断路径(评审 F7/F8 收口)
- M3/F4:异常对象(FDIV/FRET/FLAB)显式清除语义——null 字面量/空对象/空串
翻译为 Clear 命令;FlightNextState.clearedKeys 携带本次清除键;增量路径按
映射把前缀标量列置 NULL;库内清除后读视图无该键(线格式保持键缺失,显式
清除表达留待阶段 2 按下游契约定)
- StubFlightSchd 增量分支改为 nextState 权威整体替换(引擎已合并当前态),
天然承载 Clear;flattenScalarsOnly 去除冗余循环(L2)
- docs/flight-state-semantics.md:16 类结构语义矩阵定稿(P0-A 交付物落库)
- 新测试:引擎 0 标记/异常清除/混排 fail-fast 单测;JDBC 异常清除回环用例
验证:MSGX_PG_PORT=5433 真实 PG ./gradlew test --rerun-tasks
105 用例 0 失败 0 跳过
2026-09-08 15:44:48 +08:00
windyboy
48a27b26dd
feat(jobs): 提交后回填补偿落库 backfill_todo 并到期重试 (ACM2-29 P2-3)
...
- V1.3.2 迁移:backfill_todo 持久补偿表(attempts/next_attempt_at/last_error)
- BackfillTodoRepository 接口 + PG 实现与 stub;record 幂等 upsert
- BackfillSweepJob:到期重试,成功即删,失败指数退避(30s 起步封顶 15 分钟);
触发点 = InboxPoller 每轮心跳(重启即对账)+ JobExecutor BACKFILL_SWEEP 类型
- MessageProcessor/SnapshotFlow 回填失败落待办(成功终态不降级,业务不重放);
SKIPPED 重复报文同样补偿共享信箱回填,防止重复信件被反复轮询
- 新测试:扫描重试/退避/恢复对账 4 用例;快照回填失败落库断言;
跳过路径补偿落库断言
验证:MSGX_PG_PORT=5433 真实 PG 全量 102 用例 0 失败 0 跳过 (ACM2-29)
2026-09-08 13:04:43 +08:00
windyboy
44fbac0d8b
feat(persistence): FLIGHT_SCHD_DISPLAY 兼容视图 + 生产读切明细权威 (ACM2-29 P2-2)
...
- V1.3.1 迁移:flight_schd_display 视图投影首个/第二个资源与总数(gate1/gate2/
gate_total、chkc1/chkc2/checkin_total、belt1/belt_total、dely_code/strt),
完整明细仍在各明细表可查;PG LATERAL 方言,11g 随 P3-B 单独提供
- 生产读路径 mapFlightRow 切 assembleDetailOnly:集合键仅由明细表重建,
不再回退 V1.2.0 槽位/里程碑列(过渡双读仅保留在 FS7 对拍工具内)
- FlightStateEngine 正确性修复:序号属性 "0" 条目现在正确翻译为显式 Clear
(原实现 items 非空走 Replace,会存出 GTNO=0 脏明细行);混入常规条目的
0 标记 fail fast 拒绝猜测(v2 §4 非法结构显式失败)
- JDBC 用例全部切 v2 写路径(persistNextStates),删除 legacy 写路径断言;
新增:显示视图投影/替换同步用例、明细级联删除断言、引擎 0 标记语义单测
验证:MSGX_PG_PORT=5433 真实 PG ./gradlew test --rerun-tasks
97 用例 0 失败 0 跳过
2026-09-08 12:11:57 +08:00
windyboy
7abe3fbcd7
docs(flight-state): v2 设计、评审报告与决策复核入口落库 (ACM2-29)
2026-09-08 12:01:38 +08:00
windyboy
a54c3c1804
test(jdbc): make PG integration tests self-contained on env-configured port
...
Restore 3 v2 tests lost in file corruption (persistNextStates roundtrip,
legacy columns all-null, schd_gen last_message_id CAS) — 13 JDBC cases.
Add idempotent Flyway migrate in @BeforeEach so an empty container works.
Parameterize compose port as ${MSGX_PG_PORT:-5432}. Verified 14/14 green
(0 skipped) against real PostgreSQL on :5433.
2026-09-08 11:39:35 +08:00
windyboy
2af71e8fd8
feat(tools): FS7 v2 dual-read diff — detail tables vs legacy slots (P2-1)
...
Extract FlightSchdReadAssembler for detail-only, legacy-slot, and merged
read paths. Extend FlightStoreDiffTool with diffDualRead strict field
comparison. Add counterexample tests (G28/G33/G23, GTNO=3, CKDT dedupe,
ABTM ABDG, dual DELY) per review-flight-state-2026-09-08.
2026-09-08 11:30:09 +08:00
windyboy
c432492a81
test: GTDT e2e, v2 write-path guards, and PG test env support
...
Add JacksonXmlCodec/GtdtHandler/Pipeline tests, PgTestSupport for MSGX_PG_*,
and update smoke/poller expectations for real decode semantics.
2026-09-08 11:26:21 +08:00
windyboy
a936238368
feat(processing): GTDT FLOP vertical link with real XmlCodec (P2-0)
...
Add JacksonXmlCodec (XXE-safe META/FLOP parse), GtdtHandler, and unified
PipelineHolderFactory; route DNLD/FLOP through FlightStateEngine persistNextStates.
2026-09-08 11:26:20 +08:00
windyboy
bf1b5a371d
feat(persistence): v2 persistNextStates dual-write and detail-table reads
...
Wire findNextStateByFlid, CAS last_message_id, detail-table CRUD, and stub
parity for incremental/snapshot nextState persistence without legacy slot writes.
2026-09-08 11:26:19 +08:00
windyboy
57bb5ea233
feat(flight-state): add V1.3.0 detail tables and domain command engine
...
Introduce lossless detail-table schema and FlightStateEngine command model
per flight-state-design-v2 (FieldCommand, FlightNextState, collection semantics).
2026-09-08 11:26:16 +08:00
windyboy
cd5de56937
refactor(flight-schd): 全宽表零子表收敛 16 个集合并定案 PIPELINE_LOCK 行锁 (ACM2-29)
...
依据 ACM2-29 新定案【全宽表·零子表】,废除「*_TXT 过渡 + 按需升独立子表」
原规划(对 XSD maxOccurs=99 的过度设计),结合报文样例与成都现场地服实际
规律(登机门 1~2、值机柜台 1~3、转盘 1~2、延误单有效、靠撤桥/轮挡各 1 次)
将 16 个明细集合全部收敛为 FLIGHT_SCHD 宽表标量列或紧凑 VARCHAR 字串。
行为变更:
- V1.2.0 迁移:新增集合平铺槽位列(GTDT×2/CKDT×3/CLDT×2/PSDT×2/CHDT×2,
跨集合同名属性按 B 前缀/CH 前缀消解)、里程碑标量列(DELY_*、ABTM_A/D、
CHOT_ON/OFF)、异常前缀标量列(FDIV/FRET/FLAB)、紧凑航路字串
(ROUT_PATH/ERUT_PATH)与无界集合 JSON 字串列(SRVT/VIPF/MAFL_TEXT);
删除全部 16 个 *_TXT 文本列;不建任何子表、零 CLOB;
- 仓储层:删除子表替换/回查机制,写侧集合键平铺为列(序号属性 0 = 显式
删除标记,分舱复用条目抹平去重,超界按定案丢弃),读侧由平铺列重建
16 个集合键,视图与 legacy flightInfo hash 保持同构(KAFKA_SCHD 线格式
与 FS7 Diff 逐字段比对不受存储形态影响);
- I5 单写者锁修正:PIPELINE_LOCK 单行 SELECT ... FOR UPDATE 取代
PG advisory lock,PG/Oracle 11g 同构,无 DBMS_LOCK DBA 特权依赖;
- FlightFieldsJson 对契约结构字段解析 JSON tree 输出原生数组/对象,
杜绝集合被再次编码成字符串的双重转义。
不变量:消息严格 FIFO、单写者互斥、增量=字段级合并(集合键出现=单资源
集合级全量快照替换)、快照=整体替换、按代域化差删均不变。
迁移影响:本地开发库为一次性测试数据,已重置并由 Flyway 全新应用
V1.0.0→V1.2.0(同文件名内容变更,沿用旧库会触发校验和不匹配)。
验证:./gradlew test 全绿(66 个用例,含本地 PG 真实方言集成:集合槽位
替换/清除、里程碑与航路平铺回读、PIPELINE_LOCK NOWAIT 互斥与提交释放)。
2026-09-08 08:48:24 +08:00
windyboy
ff6cec08c8
refactor(flight-schd): 按现场 11g 约束将运营航班存储改为宽表 (ACM2-28 修订)
...
现场环境仅提供 Oracle 11g(无任何 JSON 能力),废除 FLTR_JSON JSONB 整文档存储:
- V1.1.0 迁移重写:FLIGHT_SCHD 改为一行一航班宽表(SCHD.FLTR 标量字段列 +
1:N 明细集合序列化文本列),SCHD_GEN.FLIDS_JSON 展开为 SCHD_GEN_FLID(FDAY, FLID);
已应用过旧版迁移的环境需重建 schema 重放
- 契约层:FlightChange/Handler 在线视图改为字段集映射(与 legacy flightInfo
hash 同构),仓储白名单拒绝未知字段;增量写=字段级合并(hmset 同语义),
快照=整体替换
- 事件载荷:快照投递与投影重建经 FlightFieldsJson 确定性序列化(键序稳定)
- 影子对拍:FlightStoreDiffTool 改为 PG 宽表列值 vs legacy FLTR JSON 逐字段
归一化比对,新增嵌套集合比对用例
- 测试:61 用例全绿(不变量门槛 1/2/3、UTC 方言、真实 PG 方言集成、清场五场景)
- 文档:decision-flight-state.md 追加 §8 修订记录(不改写定案历史),design.md 表说明同步
11g 方言移植(ON CONFLICT→MERGE、advisory lock 替代、Flyway/驱动矩阵)、
集合列升子表、类型化列提升等未尽事项另立 Plane issue 跟踪。
2026-09-07 17:04:57 +08:00
windyboy
7b7b61f100
feat(processing): 实现自有 PostgreSQL 运营航班权威存储与单事务闭环 (ACM2-28)
...
- FS1: 增加 Flyway 迁移 V1.1.0__flight_schd.sql,创建 FLIGHT_SCHD 与 SCHD_GEN
- FS2: 实现 FlightSchdRepository 接口及 JdbcFlightSchdRepository 与 StubFlightSchd,增强 JdbcOps 事务管理
- FS3: 扩展 MessageProcessor 事务 2 与按 FLID 点查视图,合并变更、事件与终态入单事务提交
- FS4: SnapshotFlow SQL 化(批处理 upsert、域内差删、SQL CAS 推进与熔断保护),JobExecutor 接入 PG 清场删除
- FS5: 彻底退役 Redis 权威与写路径,移除 FlightRedisClient、Lua 脚本、健康指示器与配置残留
- FS6: 补齐 U09/U29 不变量门禁(崩溃幂等、CAS 防并发、ADFT 存活保障、非 UTC JVM/会话时区无漂移)与 FlywayMigrationTest
- FS7: 交付影子对拍比较内核 FlightStoreDiffTool 与单元测试
- FS8: 全面回改 decision-flight-state、architecture、design、user-stories 权威文档与规范
2026-09-07 16:12:00 +08:00
windyboy
dd4bbc86ca
fix(build): 规范 gradlew.bat 换行符与权限
2026-09-07 15:11:59 +08:00
windyboy
c7b4b527ef
feat(ingress): 实现 JDBC 信箱轮询、入站持久化与对拍测试 (U05)
2026-09-07 15:11:33 +08:00
windyboy
dc68f1e1f8
chore(infra): 增加本地中间件编排、环境配置与 Kafka 降级支持
2026-09-07 15:11:06 +08:00
windyboy
abacd6a3f4
docs: 收敛架构设计规范与用户故事实施清单 (ACM2-28)
2026-09-07 15:10:57 +08:00
windyboy
bf233f7f69
docs(arch): 规范架构关键决策并清理冗余口水话与会话残留
...
- 审查重构关键架构决策:规范 D1~D8 为规范定案与权衡结构
- 扩充系统级核心决策:固化跨库存储边界(D9)、主泵单写者模型(D10)、Kafka 幂等生产契约(D11)与报文归档契约(D12)
- 清理会话残留与口水化表述(家务活/见缝插针/变砖/沙箱环境记录等)
- 规范技术栈基线与当前就绪度客观描述
2026-09-07 14:34:57 +08:00
windyboy
d9bfa576f8
docs: 标记 ACM2-23~27 Plane Done 闭环(346929e)
2026-09-07 14:15:31 +08:00
windyboy
346929ea5d
docs: 二轮审查文档收敛 ACM2-23~27(Kafka/依赖/ResponseDto/STATUS/格式)
2026-09-07 14:15:07 +08:00
windyboy and Cursor
7ccdd00a31
docs: 统一中间件定位与 JDBC 轮询主路径口径
...
Align README, architecture, design, config comments, and ingress docs
with the upstream message-processing middleware model: external CIIMS write
to CMINMSGS, JDBC poll as production ingress, HTTP /cminmsgs/send as compat.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-07 10:27:44 +08:00
windyboy
8c8d2613c2
docs: 合并文档目录——doc/ 与根目录基线材料统一入 docs/legacy/
...
消除 doc/ vs docs/ 双目录混淆(git mv 保留历史):
- doc/msgexchange-api-legacy-user-stories.md → docs/legacy/
- doc/unisysaodbsis.xsd → docs/legacy/
- SIS_AODB_RMS-V0.1.md(根目录 703KB)→ docs/legacy/
- 删除空 doc/ 目录;README「文档」导航补充 docs/legacy/(外部参考/基线材料,
非本系统文档);更新 README/architecture 与基线文档自引的路径引用。
docs/ 现为:architecture.md、design.md(自产)+ legacy/(legacy 拷贝参考)。
2026-09-07 08:29:49 +08:00
windyboy
e0ce863905
refactor(storage): ACM2-12 落地——自有 PostgreSQL 全内部状态,共享 MySQL 仅信箱
...
按 ACM2-12 定案把仓库存储口径从"MySQL 六辅助表"推进到最终形态:
- 迁移:删除 MySQL V2.0.0 六表脚本,新增自有 PG V1.0.0
(PROC_STATE/MSG_EVENT/PUMP_JOB/REQ_TRACK/REF_MASTER,PG 方言,REQ_TRACK.COUTMSGS_ID
按 U18 修为 BIGINT;FLIGHT_STATE 阶段 B 缓做不建表)。
- 配置:datasources.default = 自有 PostgreSQL(enabled=false 待 U05);
移除 datasources.reference/flyway.reference;新增 mailbox.shared-mysql(共享信箱,
仅 DML,不建表);test profile 显式启用 H2 内存 datasource。
- 接口/注释:Repositories KDoc 按 ACM2-12 归属(自有 PG / 信箱封装 / gen→Redis 占位 /
FLIGHT_STATE 缓做);InboxService、Pump 事务模型注释对正
(信箱外部副作用 + PG 本地事务 + 回填最终一致)。
- 文档:architecture §1/§2/§3/§4/§5(D1/D2)/§6/§7/§8、design §1/§2/§3.1/§3.4/§3.5/§6/§9、
README 全部按 ACM2-12 收口(自有 PG + 共享信箱 + Redis 动态/gen + 阶段 B 缓做)。
验证:37 测试全绿;dev stub 冒烟仍可启动、/health UP、收报 200。
信箱适配层(CminmsgMailbox/OutboxMailbox)、gen→Redis Lua、作业窗口语义、影子重设计
属 ACM2-12 Checks ②③④⑤(U05/U09 批次)。
2026-09-07 08:21:11 +08:00
windyboy
a3f1da4bcc
feat(ref): 21 类静态主数据独立 PostgreSQL 参考库边界就位(ACM2-11 落地)
...
按 ACM2-11 定案调整(业务事务库 MySQL + 航班动态 Redis 不变):
- 接口拆分:RefDataRepository 收为 gen-only(SCHD_GEN/流程 4 CAS,留守业务库);
新增 StaticRefRepository + RefUpsert 对齐 SOURCE 审计(N19)。
- 调用点:RequestCoordinator 应答落库、ReferenceService(21 类同步 TODO) 指向
StaticRefRepository;Decision.refUpserts 与 Pump 事务 2 注释同步
(静态写为弱事务,不入主泵事务 2)。
- Stub:StubRefData 仅 gen;新增 StubStaticRef(内存,保留 source)。
- 配置:datasources.reference / flyway.datasources.reference 占位
(PostgreSQL,enabled=false 不建连;驱动 org.postgresql 随阶段 6 实装引入,
版本由 platform BOM 约束 ~42.7);catalog 补 postgresql。
- 文档:README / docs/architecture.md §2/§6 / docs/design.md §2/§6/§9 数据边界
全部按"21 类 → PG 参考库、gen 留守 MySQL、Redis 动态不变"更新。
验证:37 测试全绿(./gradlew test,接口拆分后无破坏)。
表结构/迁移/ReferenceService 实装/应答接线属阶段 6(U05 批次后)。
2026-09-07 07:56:54 +08:00
windyboy
7e3bf383a5
docs+fix: 文档回到代码事实;修复 dev 冒烟使其真正可跑(ACM2-10 复核意见落地)
...
实测过程发现并修复四层问题,随后全部按实测结果校订文档:
- build.gradle.kts:补 application.mainClass(Kotlin 顶层 main → ApplicationKt)。
此前 ./gradlew run 报 "No main class specified",installDist 启动脚本主类为空(Dockerfile 不可运行)。
- application-dev.yml:stub 模式真正免基础设施——
* datasources.default.enabled=false(micronaut-jdbc JdbcDataSourceEnabled 条件排除 DataSource,
原注释"stub 不建连"意图未实现,DataSource eager 强制连 MySQL 导致启动失败);
* 关闭 micronaut 自带 Redis/Kafka 健康指示器(无 broker 时装配即把 /health 打成 500);
* 端点配置前缀修正:micronaut.endpoints.* 是死配置(/env 404、/beans 401 实测),
正确为顶层 endpoints.*(env 默认禁用 / beans 默认 enabled+sensitive 一并注明);
* 关闭 eureka discovery,避免无注册中心时 /health 变 DOWN。
验证:MICRONAUT_ENVIRONMENTS=dev ./gradlew run 无任何 env/外部依赖启动 → POST /cminmsgs/send
200 返回 ID → /health UP;text/plain 415(U16 缺口实证)。37 测试全绿未受影响。
- README/docs/architecture.md/docs/design.md:按实测与复核意见校订——
* README:dev 冒烟命令恢复为"无需 DB/Redis/Kafka",记录修复缘由;
* architecture:U17 服务名未落地(注册名仍取 micronaut.application.name=msgexchange-nextgen,
msgx.service-name 无消费方)、三层隔离为目标态(仅 register-eureka=false 生效)、
管理端点 5.1 实际口径(/env 默认禁用、/beans 默认 enabled+sensitive)、就绪度口径更新;
* design:§9 补 U17 行;smoke 路径 UNSUPPORTED→CODEC_ERROR 修正;毒丸 head-deadline 判据不可达、
快照 CAS 崩溃重放二次自增版本等"代码行为≠文档声明"处加实现注;I1 状态行同步。
- gradle/libs.versions.toml + gradle.properties:版本矩阵注释按依赖解析实测修正
(platform 5.1.3 生效但 core 系解析 5.1.13,classpath 混用;原"5.1.10 无平台 BOM"说法与观测不符)。
未提交内容:无。代码级缺陷(毒丸判据、CAS 重放、DNLD 路由顺序、identity 键释放等)仍属
ACM2-10 排期,本次仅按文档职责如实标注,未改动实现。
2026-09-07 07:39:57 +08:00
windyboy
f0411da5fa
docs: 补充架构文档与设计文档(docs/architecture.md + docs/design.md)
...
- architecture.md:系统定位与双跑策略、技术栈、总体拓扑(两条单线程管道)、
模块职责、关键决策 D1–D8、数据边界(六辅助表 vs legacy 旧表)、两阶段权威
与就绪度(诚实口径:生产默认不可服务,前置 U05/U07/U09/U13/U15)、
部署与安全姿态、可观测性。
- design.md:状态机与错误分类(含重放白名单)、六表数据模型(含 U18 已知缺口)、
流程 1–4 与泵作业语义、失败/重试统一设计(U08)、不变量 I1–I5 落点、
参数表、测试策略、可观测性、缺口清单对照 ACM2-10 U01–U30。
- README:新增文档导航;关联节按 ACM2-10 T16 修正改为 ACM2 现行入口
(ACM2-3 架构权威 / ACM2-4 脚手架 / ACM2-10 评审),ACMA 仅归档。
2026-09-06 22:30:03 +08:00
windyboy
6c887adf56
fix(delivery,health): U14 deleteOf 结构化 JSON + U12 健康检查真实 ping(ACM2-10 复审核验项②③)
...
- U14(复审②):deleteOf 字符串模板在 partitionKey=null/非空时均产出非法 JSON,
改 Jackson 结构化序列化(null→null 字面量,非空→带引号转义);
DispatcherTickTest 新增 phase B 两样例(readTree 合法性 + refs 精确断言)。
注:该分支仅 Phase B 且 ES 投递成功后可达,当前属潜伏缺陷。
- U12(复审③):Redis/Kafka 健康指示器由仅查 bean 存在升级为真实 ping
(false/异常→DOWN;缺 bean 仍 DOWN)。FlightRedisClient/DeliveryPort 增 ping()
(stub 返回 true;DeliveryPort 默认实现,真实 Kafka 实装时覆写为 metadata 校验)。
ping 判定拆为可单测纯函数,HealthIndicatorsTest 覆盖 UP/DOWN/异常/缺 bean 四态。
验证:./gradlew test 37 个测试全绿(本地,未推送)。
2026-09-06 22:12:23 +08:00
windyboy
6de3fa6c9c
feat(observability): U12 可观测底座(ACM2-10 U12/R05/N31b)
...
- logback:logstash 通道先加 AsyncAppender(queueSize 4096、neverBlock、discardingThreshold 0)
——logstash 不可达不阻塞业务线程(N31b 顺序约束:先降级再补日志);MDC 增加 traceId/target
- 结构化日志 + MDC traceId(TraceLog.withTrace=cminmsgsId/eventId):
InboxService 收报 INFO;MessageProcessor SUCCEEDED/SKIPPED INFO、FAILED/解码失败 WARN、
DEAD(MALFORMED/毒丸/EXHAUSTED) ERROR;SnapshotFlow staging/CAS WARN、快照成功 INFO;
Dispatcher 发送 DEBUG、逐条/整批重试 WARN、DEAD(DLQ) ERROR、flushSchd 批次 INFO;
ReplayService 重放 INFO/非法类 WARN;PipelineLifecycle 起停 INFO
- 自定义健康指示器(infra/health):redis-flight-store / kafka-delivery——BeanProvider 可选解析,
缺 bean(未 stub 也未实装)报 DOWN 而非启动失败;/health 聚合
- 保留:micrometer 队列深度/投递延迟 gauge 依赖版本选型(micronaut-micrometer 与平台 BOM 5.1.3
对齐待锁),随数据层/真实 client 批次补;U13 毒丸超时告警与 DLQ 巡检入口仍属 WP2
2026-09-06 21:02:27 +08:00
windyboy
f6da0cb782
feat(runtime): U07 生命周期装配 + stub 装配冒烟(ACM2-10 U07/U01 遗留)
...
- PipelineLifecycle:ServerStartupEvent 后在专用单线程(msgx-pump/msgx-dispatcher,daemon)
拉起 Pump/Dispatcher 循环;停机 requestStop+interrupt+join;@Requires(msgx.pipeline.autostart=true)
- PipelineProps.pipeline.autostart(默认 false,生产/测试默认不自动起循环,防泄漏线程)
- stub 装配(infra/stub,@Requires(msgx.stubs=true)):7 仓储内存实装 + StubXmlCodec(未实装
→ CODEC_ERROR 走 FAILED 可重放路径)+ StubRedis + StubDeliveryPort + Holder Factory
- 配置:application-dev.yml(stubs+autostart,/env、/beans 放开,无需 DB 即可 dev 跑通);
application-test.yml(stubs=true、autostart=false);README 补 dev stub 运行说明
- PipelineSmokeTest(4):等价 /beans 装配核验 + 收报→主泵领取→FAILED(CODEC_ERROR) + U11 重放
回 PENDING + Dispatcher flush 聚合(stub 用例前清内存状态防上下文复用串扰)
- 全量测试 34 个通过
2026-09-06 20:53:14 +08:00
windyboy
73113779d2
fix(processing): U08 重试闭环 + FailureScheduler + U11 重放入口(ACM2-10)
...
- U08 闭环:失败状态迁移移到持有 head/事件的边界内——processOne/SnapshotFlow 统一经
ProcFailure(FAILED+attempts+退避,达上限 DEAD/EXHAUSTED 并落库 attempts);Dispatcher
逐条与 SCHD 批量共用 retryOrDead;flushSchd 失败整批 attempts+1/指数退避,队首未到期不
claim,达上限整批 DEAD(DLQ);loop 只作最后防线——仅 catch Exception,InterruptedException
恢复中断位并上抛,致命 Error 不吞(异常必可见)
- 统一策略:新增 FailureScheduler(可注入 java.time.Clock + TimeFactory,backoff/exhausted
单一来源)与 ProcFailure,MessageProcessor/SnapshotFlow/Dispatcher 共用
- U11:ReplayService 显式重放入口 + ProcStateRepository.requeueByErrorClasses——仅白名单内
可恢复类(CODEC_ERROR/UNSUPPORTED/INFRA/EXHAUSTED)从 FAILED/DEAD 回 PENDING(attempts 清零),
MALFORMED 永不重放
- 测试(30 个全绿):①Pump 内部异常→FAILED(INFRA)→重试达上限 DEAD;②SCHD 连续失败退避递增→
整批 DEAD 且 KAFKA:msg 不受影响;③AssertionError/InterruptedException 不被普通恢复吞掉;
另有 ReplayService(3)、Dispatcher 批退避、InfraBindingStartupTest(DataSource 启动级绑定)
- 收尾:.gitattributes(行尾/二进制);Gradle 10 弃用告警核查——仅来自 micronaut-application
插件(BOM 注入 + IDE 文件生成),升级 Gradle 10 前需先升插件版本(已记录)
2026-09-06 19:08:02 +08:00
windyboy
2175c352f6
fix(processing): WP1 核心语义(ACM2-10 U06/U08/U10/U11)
...
- U06/N03:Dispatcher 逐条循环显式排除 KAFKA_SCHD(唯一出口 flushSchd 批量聚合),
修复 schd 事件被无条件 markSent 吞掉、flush 永远 claim 不到的整链死路;flush 失败整批
保持 PENDING、lastFlush 仅成功后推进(N24)
- U08 部分:Pump/Dispatcher loop 异常隔离(单次异常不静默死亡,U12 补告警日志);
processOne FAILED 入口 attempts 毒丸升级 DEAD(防退避到期后无限重试);
N28:backoffFor(attempt≤0) 下界保护不再抛异常
- U10/N21:未注册 handler → FAILED(UNSUPPORTED)+退避(绝不写终态);占位安全化——
HistorySweep.pickHistory 占位改空集(T07 修订)、SnapshotFlow staging 未实装改
FAILED(UNSUPPORTED)+退避而非 DEAD(N05),CAS 冲突 FAILED(INFRA)+退避(N06 紧循环修复)
- U11/T06:decode 失败差异化——MALFORMED→DEAD 不重试;CODEC_ERROR→FAILED 可重放
- 新增 ErrorClass.UNSUPPORTED;单测:DispatcherTickTest(3)/MessageProcessorTest(6)/
PipelinePropsTest(2),19 个测试全绿
2026-09-06 18:19:04 +08:00
windyboy
821da1334c
feat(build): 阶段0 冒烟底座(ACM2-10 U01–U04)
...
- U01:接入 KSP(kotlin-ksp 2.3.0)+micronaut-inject-kotlin,Micronaut BeanDefinition 由 0→94 个生成;
移除 processing.annotations 业务包过滤(N23)
- U02:补 Gradle wrapper(9.6.1);版本矩阵单一来源——micronaut 固定 5.1.3(gradle.properties
micronaut.version,平台 BOM 最高发布版)、JDK25 口径统一、snakeyaml 版本入 catalog;
新增 .github/workflows/ci.yml 与 Dockerfile;.gitignore 补 .kotlin/.opencode/.zcode/.gradle-*
- U03:application.yml 键位修正(datasources.default/flyway.datasources.default/kafka.producers.default),
移除 logstash 死配置块、logback env 统一 MSGX_LOGSTASH_*;新增 application-dev.yml(/env、/beans
仅开发放开);PipelineProps 四嵌套类补 @ConfigurationProperties;新增 PipelinePropsBindingTest
(改值—回读离线验收,Micronaut Test 5.x 用 TestPropertyProvider)
- U04:README「数据库初始化」与 V2.0.0 脚本头声明 CMINMSGS legacy 前置(全新库需先建旧表)
2026-09-06 17:59:07 +08:00
windyboy
38d5cecfac
docs: copy legacy user-stories baseline (ACMA-4) for golden replay
...
Behavior-comparison baseline referenced by ACM2-3 (G13 golden matrix).
Copied from legacy repo working copy (was untracked there).
2026-09-06 16:36:29 +08:00
windyboy
b77bb9c687
docs(readme): reference message-structure spec and XSD
2026-09-06 16:34:50 +08:00
windyboy
372612f8d0
docs: copy message-structure spec and XSD from legacy repo
...
- SIS_AODB_RMS-V0.1.md: wire protocol spec (single source of truth, frozen contract)
- doc/unisysaodbsis.xsd: message schema for codec implementation (phase 2)
Self-contained for codec work per ACM2-2/ACM2-3. Refs: ACM2
2026-09-06 16:34:00 +08:00
windyboy
105386c6fb
chore: align project name with repo msgexchange-v2 (repo.windy.me/cdia)
2026-09-06 16:22:57 +08:00
windyboy
b2f3b896cc
feat: scaffold Micronaut+Kotlin service per ACMA-8 v4 architecture
...
- 4 modules (ingress/processing/delivery/reference) + codec + infra + jobs
- Flyway V2.0.0: six aux tables (PROC_STATE/MSG_EVENT/REF_DATA/REQ_TRACK/PUMP_JOB/FLIGHT_STATE)
- Lua: snapshot_replace (atomic cover+gen-diff-delete), batch_delete (3:30 sweep)
- config: env-externalized secrets, phase A/B switch, ACMA-8 param-table defaults
- logback: logstash TCP JSON + traceId MDC
- pure-logic tests: identity (I3), schd aggregation max-by-EVENT_ID (FIX #7 )
- build verified: gradle compile+test green on JDK 25 (Micronaut 5.1 requires JVM 25+)
Migrated from legacy repo subdirectory per repo-strategy decision (separate repo
per service, org convention). Refs: ACMA-9, ACMA-8 v4, ACMA-6
2026-09-06 16:13:50 +08:00