## MODIFIED Requirements ### Requirement: 外部交互日志逐日物理留存 系统 SHALL 以 Asia/Shanghai 已结束的自然日为单位物理留存 `tb_integration_log`。删除一条已终态在线外部交互日志前,系统 MUST 已为其创建日生成可读取、可验证的归档对象和清单;该归档 MUST 包含该日当时全部外部交互日志,并验证日期范围、记录数量和校验摘要可作为恢复凭证。`pending` 记录 MUST 保留在线,不得被物理删除,且不得阻断同日已终态记录或更晚日期的归档、验证与物理清理。每次执行 SHALL 清理所有满足归档校验条件的已终态记录;某一来源的归档或校验失败时,系统 MUST 保留该来源当天及更晚日期的在线外部交互日志。 #### Scenario: 最终归档通过后清理在线外部交互日志 - **GIVEN** 某已结束自然日的外部交互归档对象和清单校验成功,且存在已终态在线外部交互日志 - **WHEN** 日留存任务处理该日期 - **THEN** 系统分批删除该日已终态的在线外部交互日志并保留归档对象 #### Scenario: 存在待完成外部交互日志 - **GIVEN** 某归档日仍存在待完成的外部交互日志 - **WHEN** 日留存任务尝试处理该日期 - **THEN** 系统保留该 pending 日志,但不得停止同日终态记录和更晚日期的清理 #### Scenario: 含 pending 的日期清理终态日志 - **GIVEN** 某已结束自然日同时存在已终态和 `pending` 的外部交互日志,且该日归档对象和清单校验成功 - **WHEN** 日留存任务处理该日期 - **THEN** 系统分批删除该日已终态的在线外部交互日志,保留 `pending` 记录,并保留归档对象 #### Scenario: 历史积压按日期连续补清 - **GIVEN** 存在多个昨天及更早日期尚未完成物理清理,且这些日期各自存在满足归档校验条件的已终态外部交互日志 - **WHEN** 日留存任务执行 - **THEN** 系统按日期从早到晚清理全部符合条件的终态日志 #### Scenario: pending 不阻断后续日期 - **GIVEN** 较早归档日只剩 `pending` 外部交互日志,且更晚归档日存在满足归档校验条件的已终态外部交互日志 - **WHEN** 日留存任务执行 - **THEN** 系统继续处理更晚归档日的已终态外部交互日志,不因较早日期的 pending 停止日期推进 #### Scenario: pending 后续终结 - **GIVEN** 某归档日的 pending 外部交互日志在该日首次留存后进入公开终态 - **WHEN** 后续日留存任务执行 - **THEN** 系统为包含该记录的当前在线集合重新验证归档,并删除该已终态记录 #### Scenario: 归档或校验失败保留同来源后续数据 - **GIVEN** 某归档日的外部交互归档缺失、归档校验失败或清单与在线数据不一致 - **WHEN** 日留存任务处理该日期 - **THEN** 系统不删除该日及更晚日期的在线外部交互日志,并将失败信息写入独立日留存日志 ### Requirement: 外部失败边界 系统 SHALL 将第三方超时、渠道错误和无效响应转换为当前稳定的系统错误;已接入外部交互日志的渠道同时保留脱敏结果。Gateway 同步轮询在已建立 pending 外部交互日志后,无论查询成功、失败或任务上下文取消,MUST 尝试将该尝试终结为公开终态;终结失败 MUST 作为任务失败返回或记录为可重试错误,不得静默忽略。 #### Scenario: 外部失败边界 - **GIVEN** 外部系统超时或返回失败 - **WHEN** 调用依赖该系统的操作 - **THEN** 客户端收到当前稳定错误;已接入外部交互日志的调用记录脱敏渠道结果 #### Scenario: Gateway 轮询查询失败 - **GIVEN** Gateway 同步轮询已建立 pending 外部交互日志且查询返回错误 - **WHEN** 轮询任务处理该错误 - **THEN** 系统将该日志终结为失败或结果未知的公开终态,并按既有策略重新入队 #### Scenario: Gateway 轮询终结日志失败 - **GIVEN** Gateway 同步轮询已建立 pending 外部交互日志且终结写入失败 - **WHEN** 轮询任务结束该次尝试 - **THEN** 系统记录并返回该终结失败,不得把该错误静默丢弃