## Purpose

定义历史拨测数据的自动清理机制：可配置的保留时长和定时清理调度。

## Requirements

### Requirement: 数据保留配置
系统 SHALL 支持通过 `server.storage.retention` 配置项指定历史数据保留时长，格式为持续时间字符串（`<数字><单位>`，单位支持 `d`/`h`/`m`）。

#### Scenario: 配置 7 天保留
- **WHEN** 配置文件中 `server.storage.retention` 设置为 `"7d"`
- **THEN** 系统 SHALL 保留最近 7 天的检查结果，清理更早的数据

#### Scenario: 配置小时级保留
- **WHEN** 配置文件中 `server.storage.retention` 设置为 `"24h"`
- **THEN** 系统 SHALL 保留最近 24 小时的检查结果

#### Scenario: 未配置 retention
- **WHEN** 配置文件中未指定 `server.storage.retention`
- **THEN** 系统 SHALL 使用默认值 `"7d"`

#### Scenario: 无效 retention 格式
- **WHEN** 配置文件中 `server.storage.retention` 格式不合法（如 `"abc"`、`"7x"`）
- **THEN** 系统 SHALL 在配置校验阶段报错，拒绝启动

### Requirement: 定时清理调度
系统 SHALL 以固定间隔（1 小时）定期执行数据清理，删除超过保留时长的历史检查结果，并清理已无关联检查结果的非活跃目标行。

#### Scenario: 引擎启动后首次清理
- **WHEN** ProbeEngine 启动
- **THEN** 系统 SHALL 立即执行一次清理，然后每隔 1 小时再次执行

#### Scenario: 清理执行
- **WHEN** 清理定时器触发
- **THEN** 系统 SHALL 删除 `check_results` 表中 `timestamp` 早于 `now - retentionMs` 的所有记录

#### Scenario: 清理空壳非活跃目标
- **WHEN** 清理定时器触发且 check_results 过期清理执行完毕
- **THEN** 系统 SHALL 删除 `targets` 表中 `active = 0` 且在 `check_results` 表中不存在任何关联记录的目标行

#### Scenario: 引擎停止时清除定时器
- **WHEN** ProbeEngine.stop() 被调用
- **THEN** 系统 SHALL 清除清理定时器，不再执行后续清理

#### Scenario: retention 为 0 时不清理
- **WHEN** 配置的 retention 解析为 0 毫秒
- **THEN** 系统 SHALL 不注册清理定时器，数据永久保留
