All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 12m8s
- 审计注册表为可由系统任务、定时任务发起的动作声明落库策略(always/on_success/outcome/log_only/none),未声明按 log_only - 人工、开放接口、个人客户、外部系统发起的动作始终写审计表 - log_only 写所在服务 app.log(logger=audit),不含快照 - 对接日志不再补写 integration.attempt_started,无上游审计时 audit_event_id 为空 - 新增 audit.persist_overrides 按动作覆盖策略 - 审计覆盖扫描要求机器动作必须声明策略 - 新增 OpenSpec 提案 refactor-audit-log-persistence 与技术方案文档 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.4 KiB
2.4 KiB
ADDED Requirements
Requirement: 退款资产后处理尝试记录
系统 SHALL 在每次执行退款资产后处理时写一条尝试记录,只新增,不修改、不删除。
- 记录内容:退款单、处理步骤(套餐失效、接续激活、停机评估或停机)、资产类型与资产 ID、ICCID、尝试序号、触发方式(Outbox 投递、补偿扫描、人工重试)、结果、错误码、错误信息(截断)、关联的停复机记录、耗时、记录时间。
- 尝试记录 SHALL 按月分区。
- 尝试记录写入失败 MUST 只记录告警,不影响后处理结果。
Scenario: 一次尝试失败
- WHEN 退款资产后处理在套餐失效步骤失败
- THEN 系统写一条尝试记录,步骤为套餐失效,结果为失败,并带错误码与错误信息
Scenario: 一次尝试成功
- WHEN 退款资产后处理全部步骤成功
- THEN 系统写一条结果为成功的尝试记录
Requirement: 退款资产后处理重试上限
系统 SHALL 在退款单上维护资产后处理的当前状态、已尝试次数、最后错误与下次重试时间。
- 后处理失败时,系统 SHALL 按指数退避计算下次重试时间,间隔最长 1 小时。
- 已尝试次数达到 10 次仍未成功时,系统 MUST 把状态置为"需人工处理",并停止自动重试。
- Outbox 投递与补偿扫描 MUST 按上述状态与下次重试时间判断是否执行:未到下次重试时间的不执行,"需人工处理"的不执行。
- 后台人工重试 SHALL 允许重新执行"需人工处理"的退款单,并记为人工重试触发;执行前已尝试次数不清零。
- 重复执行 MUST 保持既有幂等:不重复失效套餐,不重复处理资产。
Scenario: 退避重试
- GIVEN 一张退款单的资产后处理第 3 次失败
- WHEN 补偿扫描在下次重试时间之前运行
- THEN 系统不执行该退款单的后处理
Scenario: 达到上限转人工
- GIVEN 一张退款单的资产后处理已失败 9 次
- WHEN 第 10 次仍失败
- THEN 退款单状态为需人工处理,Outbox 与补偿扫描不再执行它,审计写一条结论为失败的事件
Scenario: 人工重试成功
- GIVEN 一张需人工处理的退款单
- WHEN 运营在后台发起人工重试并成功
- THEN 退款单状态为已完成,尝试记录新增一条触发方式为人工重试、结果为成功的记录