windyboy
|
5b7938ac4b
|
docs(acm2-74): 补齐 FLOP 逐类语义、静态参考数据与数据结构
自洽与精简:
- specification 补第四种状态词 [我们自证]、验证映射补 INV-14 两行、去 CLM-7/CLM-9 的进度语、补编号空缺说明
- architecture/requirements/implementation 去除逐字复述(领域决策三写句、时间常数排序、C-25/C-26、INV-12/21/22)与参数值重复
- README 与新文档对齐:收报谓词改 ID>W、删不存在的 reference/ 包与 lua/、删 msgx.phase 与 MSGX_REDIS_URI、设计权威口径改 docs/、进度段改指 Plane
内容补齐:
- 新增 implementation.md「动态运行事件(FLOP)」:按 SIS 3.19–3.43 的 25 类逐类映射与空标签语义(含 CNCL 空标签为撤销等),补 RMS→AODB 方向拒绝、ROUT 只保留 4 条、VIPP 忽略等约束;厘清 legacy 29 类与 SIS 25 类的差集
- 新增 implementation.md「静态参考数据」章:13 类参考数据与资源状态的 RTYPE/RKEY、list 与增量合并语义、删除只由 DEL 表达、SLST/REMT/RSTA 机位与登机桥映射
- §11.3 数据结构改为标量分组表与集合明细表(元素键、条数上限、SIS 锚点)
- specification 新增 G-FLOP-DIRECTION / G-FLOP-UNMAPPED / G-REF-DATA;Q8 收窄为真实报文分布与 admin-api 清单
|
2026-09-14 07:34:17 +08:00 |
|
windyboy
|
cedd859bdf
|
docs(acm2-74): consolidate design documentation
|
2026-09-13 20:31:13 +08:00 |
|
windyboy
|
800d7617f2
|
chore(db): 压缩 Flyway 迁移链为单基线
原 V1–V10 的净结构全部合并进 V1__flight_state_baseline.sql,迁移链收敛为一条。
表集合、逐列类型/非空/默认值、表级约束、索引与种子行经重放比对与旧链条一致;
仅丢弃 5 条只对既有库有意义的存量数据语句(RECEIVED_AT/ENQUEUED_AT 回填、
schd 与开放请求去重、SENT_AT 回写)。
已按旧链迁移过的库版本链与校验和对不上,必须重建 schema 或删除数据卷后重跑,
禁止手工 repair 或改写 flyway_schema_history。
- 删除 V2–V10 共 9 个迁移文件
- 注释统一范式并改用稳定 ID(INV-x/C-x/G-x),修正 KAFKA_MSG/KAFKA_SCHD 与实际值不符
- 同步 docs/reference.md、docs/user-stories.md、oracle11g/README.md、README、application.yml、compose.yaml
- FlywayMigrationTest 改为断言单基线,并补 MSG_EVENT.SENT_AT 覆盖
|
2026-09-13 16:31:14 +08:00 |
|
windyboy
|
62f61ad9e4
|
feat(delivery): 真实 Kafka 投递端口 + 闭合 G-BACKFILL-BACKOFF 配置缺口
- 新增 KafkaDeliveryPort:ProducerRegistry + 同步 Future.get() 至少一次投递,
闭合 OPS-1 真实适配器要求与 US-07 INV-10/C-29
- 回填退避从硬编码 30s/15min 提升为 backfill-backoff-ms / backfill-backoff-cap-ms
配置绑定,闭合 [G-BACKFILL-BACKOFF]
- 删除死依赖 micronaut-redis-lettuce(代码零引用,ACM2-28 Redis 已退出阶段 A)
|
2026-09-13 16:26:03 +08:00 |
|
windyboy
|
5bb9d6bb07
|
docs(spec): 精简需求边界闭合方案
|
2026-09-13 16:01:07 +08:00 |
|
windyboy
|
fc744d0cfd
|
feat(acm2): 闭合 G-KAFKA-D3 / G-IGNORE / G-EVENT-RETENTION 三个缺口
- G-KAFKA-D3:max-in-flight 默认收敛到 1,KafkaD3Check 启动自检钉住三项联合满足 D3
- G-IGNORE:IgnoreRules 在身份绑定后精确匹配 TYPE 字段,命中写 SKIPPED + 回填意图
- G-EVENT-RETENTION:V10 迁移加 SENT_AT 列,投递原子写,EventCleanupJob 有界清理过期 SENT 行
|
2026-09-13 15:48:16 +08:00 |
|
windyboy
|
d37a9eb38e
|
docs(spec): 收敛领域边界闭合方案为三个缺口
- 本轮只做 G-KAFKA-D3 / G-IGNORE / G-EVENT-RETENTION,其余缺口不再写入 spec
- 删除约束与表结构副本、User Stories 重复、phase B 清单与进度记录
- US-04 AC1 明确先绑定身份再转 SKIPPED,引用改用稳定 ID US-03
|
2026-09-13 13:49:06 +08:00 |
|
windyboy
|
30dc8adf00
|
docs(spec): 领域边界闭合 spec 与配套文档修正
新增 docs/spec-boundary-closure.md:自包含 spec,内联展开所有
PRE/INV/CLM/D/C/US/PARAM/Q/错误分类/表结构/时间常数序引用,
覆盖 G-KAFKA-D3 / G-IGNORE / G-EVENT-RETENTION / G-BACKFILL-BACKOFF
/ G-PROC-HST 五个缺口的实现决策、验收与测试决策。
同步修正 design.md(归档段落改条件 DELETE、ARCHIVED 影子行、
SENT_AT 描述)与 user-stories.md US-11(AC1 改 UPDATED_AT、
AC2 删投递判据、AC3 补条件回滚语义)。
|
2026-09-13 12:52:21 +08:00 |
|
windyboy
|
729e102b8e
|
docs(lifecycle): 补齐清除生命周期与逐对象归档边界
- design.md 9.3 扩为「生命周期与清除」:清除通则、逐对象生命周期表、
处理终态归档判据(终态 ∧ 回填了结 ∧ 终局后到期)与时间常数排序
- contracts.md 新增 C-16:回填放弃清单在对应信箱边界清除前必须保持可查
- invariants.md 缺口索引新增 G-HST-RETENTION、G-FLIGHT-HIST-RETENTION、
G-REQ-TRACK-RETENTION
- flight-state.md 补航班历史存储保留期开放项
- 同步 architecture.md / user-stories.md 的 9.3 交叉引用
|
2026-09-13 10:49:48 +08:00 |
|
windyboy
|
17a4bfe91b
|
feat(codec): 观测未落库的 SRVT/VIPF 集合
SRVT/VIPF 只保留在 wire/domain 并计数告警,不落明细表、不参与合并:
出现事实不再被静默丢弃,为 Q13 定案提供真实流量证据([G-SRVT-VIPF])。
- wire DTO:SRVT/SERVICEDATA、VIPF/VIPDATA 与嵌套 VIPT(OPER 为元素属性)
- 出现即留键:缺席与"出现但为空"不再等价;已落库 10 类集合语义不变
- 新增 msgx.pipeline.codec.srvt_seen.total / vipf_seen.total(reference.md 已登记)
- 一并提交此前的 MAFL 文档改动(INV-21/INV-22、flight-state §2.3、G-MAFL 措辞)
|
2026-09-13 09:21:51 +08:00 |
|
windyboy
|
b8738554e6
|
refactor(ingress): 移除 G1 窗口补偿扫描与迟到到达检测
实际负载不足 10 条/秒,G1 属过度防御。删除迟到到达检测机制、
existingIds 接口、PipelineCounters 字段、lateDetect 配置,
以及文档中 CLM-1/CLM-2 声明与 G1 缺口索引。
|
2026-09-13 08:08:43 +08:00 |
|
windyboy
|
a6b2120836
|
fix(infra): 消除 StubRepositories 编译警告
- KDoc 移到注解之前(2 处)
- upsertSchd 改显式 null 检查避免 !! 警告
- findBackfillDue 链式调用转 asSequence
- 移除 persistFullState 中 always-null 的 fallback
- markDeleted/revive 改 !! 断言(mains/snapshots 同步写入)
|
2026-09-12 22:39:16 +08:00 |
|
windyboy
|
8053c01964
|
docs(contracts): Q8/Q13 标记为暂缓
- Q8 逐类清单现阶段不处理
- Q13 缺失字段语义测试前不决定,真实消息优先于 SIS 文档
|
2026-09-12 22:39:09 +08:00 |
|
windyboy
|
cfece0c559
|
docs: drop merged message-lifecycle stub
message-lifecycle.md 内容已全部并入 design.md / contracts.md;仓库内唯一引用是 docs/README.md 的跳转说明,已同步删除并在「当前状态」记录删除事实。历史链接按 README §2 职责表重定向到 design.md。
|
2026-09-12 21:04:42 +08:00 |
|
windyboy
|
82cc70cbb3
|
docs(acm2-63): 精简架构文档并闭合模块入口登记
architecture.md 138→116 行:删除 §9「当前实现与上线门槛」(进度内容,归 invariants 声明边界与 Plane,其中部署前提并入 §8);§4 主流程压成链路摘要 + design 节名指针,去掉与 design 重复的机制细节;§8 可观测性收成一句并把指标口径指向 reference;D1–D4 第三列由「当前状态」改为「证据 / 缺口」稳定 ID 指针。
reference.md:模块入口补 infra/metrics/JobActivity.kt、infra/health/JobRunnerHealthIndicator.kt 与 config/OperationDayProps.kt;迁移清单补 V7–V9。
|
2026-09-12 21:03:23 +08:00 |
|
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 |
|