# Payload Replay Scripts

本目录提供基于本地 payload archive 的手工 replay 入口。

## `multi_rir_case_info.py`

用于从 multi-RIR bundle 中解析指定 `rir` 的输入路径、对照 CSV、fixture、以及 Routinator replay timing 基线。

示例：

```bash
python3 scripts/payload_replay/multi_rir_case_info.py \
  --bundle-root ../../rpki/target/live/20260316-112341-multi-final3 \
  --rir afrinic
```

也支持输出 shell 环境变量：

```bash
python3 scripts/payload_replay/multi_rir_case_info.py \
  --bundle-root ../../rpki/target/live/20260316-112341-multi-final3 \
  --rir afrinic \
  --format env
```

## `run_multi_rir_replay_case.sh`

统一的 multi-RIR 入口。给定 `rir` 和模式后，它会自动选择该 RIR 的：

- snapshot/base replay 输入
- delta replay 输入
- 对照 CSV
- TAL / TA fixture
- trust anchor 名称

用法：

```bash
./scripts/payload_replay/run_multi_rir_replay_case.sh <rir> [describe|snapshot|delta|both]
```

示例：

```bash
./scripts/payload_replay/run_multi_rir_replay_case.sh afrinic describe
./scripts/payload_replay/run_multi_rir_replay_case.sh lacnic snapshot
./scripts/payload_replay/run_multi_rir_replay_case.sh arin delta
./scripts/payload_replay/run_multi_rir_replay_case.sh ripe both
```


脚本会自动：

- 从 multi-RIR bundle 中选择指定 RIR 的 snapshot/base 与 delta 输入
- 读取该 RIR 的 Routinator `base-replay` / `delta-replay` timing 基线
- 优先使用 `base-locks.json.validationTime` 与 `locks-delta.json.validationTime` 作为 replay `--validation-time`；若缺失才回退到 `timings/base-replay.json` 与 `timings/delta-replay.json` 的 `startedAt`
- 在 `target/live/multi_rir_replay_runs/<rir>/` 下生成：
  - snapshot replay 产物
  - delta replay 产物
  - per-RIR 合并 case report（含 correctness + timing compare）

默认 bundle 根目录为：

- `../../rpki/target/live/20260316-112341-multi-final3`

也可以通过 `BUNDLE_ROOT` 覆盖。

## `run_apnic_snapshot_replay_profile.sh`

基于 multi-RIR bundle 中的 APNIC snapshot 输入，使用当前 replay 主流程执行一次带 `--analyze` 和 `--profile-cpu` 的离线 profile。

```bash
./scripts/payload_replay/run_apnic_snapshot_replay_profile.sh
```

作用：

- 使用 `APNIC` 的 snapshot/base replay 输入
- 自动开启：
  - `--analyze`
  - `--profile-cpu`
- 自动记录：
  - replay wall-clock 时长
  - Routinator baseline (`base-replay`)
  - analyze 目录路径
- 生成：
  - `report.json`
  - `run.log`
  - `meta.json`
  - `summary.md`
  - 以及 `target/live/analyze/<timestamp>/` 下的：
    - `timing.json`
    - `flamegraph.svg`
    - `pprof.pb.gz`

支持：

- `DRY_RUN=1`：只打印命令，不真正执行
- `MAX_DEPTH` / `MAX_INSTANCES`：用于限定 replay 范围
- `PROFILE_RUN_ROOT`：覆盖 wrapper 产物输出目录

## `run_apnic_replay.sh`

默认使用：

- `tests/fixtures/tal/apnic-rfc7730-https.tal`
- `tests/fixtures/ta/apnic-ta.cer`
- `target/live/payload_replay/payload-archive`
- `target/live/payload_replay/locks.json`

运行：

```bash
./scripts/payload_replay/run_apnic_replay.sh
```

产物默认输出到：

- `target/live/payload_replay_runs/`

包含：

- replay DB 目录
- `report.json`
- `run.log`
- `meta.json`
- `summary.md`

## 环境变量

可覆盖：

- `TAL_PATH`
- `TA_PATH`
- `PAYLOAD_REPLAY_ARCHIVE`
- `PAYLOAD_REPLAY_LOCKS`
- `VALIDATION_TIME`
- `MAX_DEPTH`
- `MAX_INSTANCES`
- `OUT_DIR`
- `RUN_NAME`
- `DB_DIR`
- `REPORT_JSON`
- `RUN_LOG`
- `META_JSON`
- `SUMMARY_MD`

## 说明

- 该脚本依赖 `rpki` CLI 已支持：
  - `--payload-replay-archive`
  - `--payload-replay-locks`
- replay 模式必须搭配离线 TAL/TA 输入，不会去访问真实 RRDP / rsync 网络源。

## `report_to_routinator_csv.py`

把 `rpki` 生成的 `report.json` 转成 Routinator 风格的 VRP CSV：

```bash
python3 scripts/payload_replay/report_to_routinator_csv.py \
  --report target/live/payload_replay_runs/<run>_report.json \
  --out target/live/payload_replay_runs/<run>_vrps.csv \
  --trust-anchor apnic
```

输出列为：

- `ASN`
- `IP Prefix`
- `Max Length`
- `Trust Anchor`

## `compare_with_routinator_record.sh`

把 ours 生成的 VRP CSV 与 Routinator 的 `record.csv` 做对比：

```bash
./scripts/payload_replay/compare_with_routinator_record.sh \
  target/live/payload_replay_runs/<run>_vrps.csv \
  target/live/payload_replay/record.csv
```

会产出：

- compare summary Markdown
- `only_in_ours.csv`
- `only_in_record.csv`

## `run_apnic_replay.sh` 现有额外产物

脚本现在除了 `report/meta/summary`，还会额外生成：

- `vrps.csv`
- 若 `ROUTINATOR_RECORD_CSV` 存在，则生成：
  - compare summary
  - `only_in_ours.csv`
  - `only_in_record.csv`

## `run_apnic_delta_replay.sh`

使用 APNIC delta demo 数据集运行 base + delta replay：

```bash
./scripts/payload_replay/run_apnic_delta_replay.sh
```

默认输入：

- `target/live/apnic_delta_demo/20260315-170223-autoplay/base-payload-archive`
- `target/live/apnic_delta_demo/20260315-170223-autoplay/base-locks.json`
- `target/live/apnic_delta_demo/20260315-170223-autoplay/payload-delta-archive`
- `target/live/apnic_delta_demo/20260315-170223-autoplay/locks-delta.json`
- `tests/fixtures/tal/apnic-rfc7730-https.tal`
- `tests/fixtures/ta/apnic-ta.cer`

输出目录默认：`target/live/payload_delta_replay_runs/`

## `run_apnic_delta_replay.sh` compare outputs

脚本现在在 delta replay 结束后还会额外生成：

- `vrps.csv`
- compare summary Markdown
- `only_in_ours.csv`
- `only_in_record.csv`

默认 compare 输入是：

- `target/live/apnic_delta_demo/20260315-170223-autoplay/record-delta.csv`

也可以通过环境变量覆盖：

- `TRUST_ANCHOR`
- `ROUTINATOR_RECORD_CSV`
- `VRPS_CSV`
- `COMPARE_SUMMARY_MD`
- `ONLY_IN_OURS_CSV`
- `ONLY_IN_RECORD_CSV`

## `write_multi_rir_case_report.py`

把某个 RIR 的 snapshot replay 与 delta replay 的 `meta.json`、compare summary 以及 Routinator timing 基线合并成一个 per-RIR Markdown/JSON 报告。

该脚本通常由 `run_multi_rir_replay_case.sh <rir> both` 自动调用。

## `run_multi_rir_replay_suite.sh`

顺序执行 5 个 RIR（或环境变量 `RIRS` 指定的子集）的 `both` 模式，并最终生成 multi-RIR 汇总报告。

```bash
./scripts/payload_replay/run_multi_rir_replay_suite.sh
```

可覆盖环境变量：

- `BUNDLE_ROOT`
- `SUITE_OUT_DIR`
- `RIRS`

最终输出：

- `<suite_out_dir>/<rir>/<rir>_case_report.md`
- `<suite_out_dir>/multi_rir_summary.md`
- `<suite_out_dir>/multi_rir_summary.json`

## `write_multi_rir_summary.py`

汇总 5 个 RIR 的 per-RIR case report，生成 correctness + timing 总表与几何平均比值。
