All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m52s
2.5 KiB
2.5 KiB
02 — 交付实名观测的公共写入闭环
What to build: 轮询、手动同步和运营商回调可以提交类型明确的实名观测,由唯一公共用例锁定卡、应用首次实名与周期逆转规则,并在同一事务中保存卡状态、Audit Event 和 Outbox。有效但无变化的观测仍更新时间和 Integration Log,重复观测不会重复激活套餐或执行业务副作用。
Blocked by:
.scratch/tech-public-foundation/issues/02-transactional-public-outbox-write.md— 02 — 在业务事务中可靠写入公共 Outbox.scratch/tech-public-foundation/issues/03-outbox-at-least-once-delivery.md— 03 — 完成 Outbox 到 Asynq 的至少一次投递闭环.scratch/tech-global-audit/issues/01-audit-event-write-loop.md— 01 — 交付不可变 Audit Event 写入闭环.scratch/tech-global-audit/issues/02-integration-log-attempt-loop.md— 02 — 交付可恢复的 Integration Log 尝试闭环
Status: ready-for-agent
架构通道: 复杂写;主链路为 Handler/Worker → Application → Domain → Repository/Infrastructure。
完整业务边界: 本票建立公共卡观测契约及实名观测的完整业务边界,包括首次实名、周期逆转确认、可靠事件和提交后缓存处理。明确不迁移流量、网络、套餐轮询、保护期轮询或未触碰的旧实名查询;运营商解除实名回调不进入逆转计数。
- 公共观测元数据和实名观测均使用类型明确的领域输入,包含来源、场景、观测时间、请求/关联标识及脱敏上游摘要,领域层不依赖 Gateway、Fiber、GORM、Redis 或 Asynq 类型。
- 应用用例在事务中锁定卡,首次从未实名变为已实名时只写一次首次实名时间,并可靠发布卡/设备套餐首次激活、设备实名投影和停复机评估所需事件。
- 周期查询的未实名观测保留连续三次确认和 10 分钟窗口,未达阈值不把已实名卡改为未实名;回调来源的解除实名观测不能增加该计数。
- 有效无变化观测更新时间并写 Integration Log,但不重复发布首次实名或状态变化事件;缺少关键字段的观测不以零值覆盖本地状态。
- 卡状态、Audit Event 和 Outbox 任一步失败均整体回滚;缓存失效或回填只在提交后执行,失败可观察且不伪造事务成功。
- 单元及 PostgreSQL 并发测试覆盖首次成功、重复成功、逆转阈值、窗口过期、无变化、无效载荷、同一卡串行、事务回滚和事件幂等。