# verification-only 使用说明

`verification-only` 用于复核启用验证缓存的最新成功 normal run。它冻结当前仓库视图，关闭 PP、ROA、child certificate cache、prefetch、VCIR 持久化和网络访问，在源 CIR 的同一验证时间重新执行完整验证，并比较 CCR 的 MFT、VRP、VAP、TA、router key 五类 state digest。

## 前提

- 源 run 必须是当前 state DB 对应的最新成功 normal run。
- 源 run 必须包含 `input.cir`、`result.ccr`、`run-summary.json` 和 `validation-contract.json`。
- state root 必须包含 `db/work-db`、`db/repo-bytes.db` 和 `meta/current-state-binding.json`。
- 源 normal run 必须启用至少一种验证缓存；仅启用 transport prefetch 不算验证缓存。
- verification-only 与 normal soak 共用 `state/locks/state-execution.lock`，不能绕过 wrapper 并发执行。

## 执行

在 portable package 根目录执行：

```bash
./scripts/verification/run_verification_only.sh \
  --source-run-dir /data/ours-rp/runs/run_0123 \
  --source-state-root /data/ours-rp/state \
  --out-dir /data/ours-rp/verification-runs/run_0123
```

验证时间自动从源 `input.cir` 读取，不接受命令行覆盖。成功后 scratch work-db 默认删除；排障时可加 `--keep-scratch`。

## 输出

- `input.cir`、`result.ccr`、`report.json`
- `vrps.csv`、`vaps.csv`
- `stage-timing.json`、`validation-events.jsonl`
- `validation-contract.json`、`verification-meta.json`
- `compare/ccr-state-digest.json`、`compare/ccr-state-digest.md`
- `stdout.log`、`stderr.log`、`process-time.txt`、`wrapper-timing.json`

通过条件是 compare JSON 中 `stateDigestMatch=true`。`producedAt` 不参与比较。

## 隔离保证

- 不分配 normal run id，不更新 lifecycle、periodic snapshot 计数和 retention。
- 源 work-db 只用于创建 checkpoint，后续写入只发生在独立 scratch work-db。
- 源 repo-bytes.db 以只读模式打开。
- 输出目录必须不存在，防止覆盖旧验证证据。

## 常见失败

- `current state binding`：所选 run 已不是当前 state 对应的最新成功 run，需选择 binding 指向的 run。
- `differs from current state binding`：源 CIR、CCR 或 contract 已变化，不能继续复核。
- `blob is missing`：repository view 引用的原始 bytes 不完整，验证不会启动。
- `did not enable a validation cache`：源 run 不是缓存正确性对比的有效基准。
- `CCR state digest mismatch`：查看 `compare/` 下 JSON/Markdown，按不匹配状态集合继续排查。
