ADR-0225 (sweep boundary に audit_log を同梱 · 2026-07-08 受理) の Confirmation 4 KPI の観測結果を時系列で記録する。SSoT は ADR-0225 §9 Confirmation。実測記録は Phase 0 dogfood の retention sweep 実行開始 (P3-2 enable_retention_manager = true 反映後) 以降に埋める。それまでは Week 0 節 (準備状態) を維持する。

KPI と観測方法

#KPI観測方法SLO違反時対応
1audit_log INSERT の完全性 (孤立検出)週次 SQL 実行 (LEFT JOIN で receipt_id 不在の孤立 audit_log 検出)常時 0 件lock-transaction-boundary の tx 境界 review + INSERT 経路実装確認
2audit_log INSERT の二重化検出週次 SQL 実行 + Phase 1 移送 PR merge 前に 1 回 (同一 target_id で action='retention_sweep_delete' が 2 件以上)常時 0 件VLT_AUDIT_LOG_ENABLED gate 状態と lock-transaction-boundary の INSERT 残存有無を即時確認
3sweep atomicity 継承 + 5 module 固有障害シーケンスvlt/tests/e2e/sweep-audit-atomicity.test.ts 3 種 orphan + 4 case (GCS 削除失敗 · hold gate 評価失敗 · audit_log INSERT 失敗 · GCS 削除成功→Postgres COMMIT 失敗) が CI 各 push で自動走行 · 週次 pattern 確認CI 継続 green実装再設計と sweep.ts 復活 (feature flag による切戻し可能状態)
4Phase 0 → Phase 1 caller 遷移追跡月次 SQL 実行 (audit_log の phase / caller 分布) · Phase 1 移送時に 1 回Phase 0 期間 phase='0'/caller='lock-transaction-boundary' 100% · Phase 1 phase='1'/caller='event-emitter' 100%event-emitter 有効化後も lock-transaction-boundary が INSERT 継続 = 移送漏れ検出

Week 0 (準備状態 · 実測未開始)

実測開始トリガー: Phase 0 dogfood の enable_retention_manager = true 切替反映後の retention sweep 実行開始 (P3-2 flag flip · session 47 handover で Phase B 実装後に予定)。

Week 0 節では KPI 1-4 の観測を実施せず、Phase B 実装 PR 内の以下の準備状態のみ記録する:

  • Phase A shipping (session 46-47 · PR #5510 + #5517 hotfix): schema.sql の audit_log に phase (varchar(8) NOT NULL CHECK 3 値) + caller (text NOT NULL) 2 列追加 + 複合 index + FORCE RLS + POLICY 2 個 (ADR-0229 段階分割 (a) 相乗り) · lock-transaction-boundary.ts に AUDIT_LOG_CALLER runtime gate + audit_log INSERT block 追加
  • Phase B shipping (session 48 · 本 PR): Terraform に AUDIT_LOG_CALLER='lock-transaction-boundary' env var 追加 · e2e test 差替 (sweep.ts → runRetentionManagerJob) + 4 case のうち 2 case 骨格 (残 2 case は Postgres error injection helper が必要なため follow-up) · sweep.ts 削除 · integration test 13 case に audit_log assertion 追加 · vlt-schema-lint に 4 rule (SCHEMA 1 + WIRING 3) 追加

Month 1 (実測初回 · 骨格 · 回答受領後に埋める)

実測開始日: YYYY-MM-DD ・ 記帳日: YYYY-MM-DD

Week 0 の準備状態から Phase 0 dogfood retention sweep 実行が始まった月に本節を新設し、KPI 1-4 の週次観測結果を月末に集計する。

KPI 1: audit_log INSERT 完全性 (孤立検出)

SELECT COUNT(*) AS orphan_count FROM deletion_events de
  LEFT JOIN audit_log al
    ON al.target_id = de.receipt_id
    AND al.action = 'retention_sweep_delete'
  WHERE de.created_at > NOW() - INTERVAL '7 days'
    AND de.reason = 'retention_expired'
    AND al.id IS NULL;
実行日orphan_countSLO 判定補足
Week 1YYYY-MM-DD0
Week 2YYYY-MM-DD0
Week 3YYYY-MM-DD0
Week 4YYYY-MM-DD0

KPI 2: audit_log INSERT 二重化検出

SELECT target_id, COUNT(*) AS dup_count
  FROM audit_log
  WHERE action = 'retention_sweep_delete'
    AND created_at > NOW() - INTERVAL '7 days'
  GROUP BY target_id
  HAVING COUNT(*) > 1;
実行日dup_count 合計SLO 判定補足
Week 1YYYY-MM-DD0

KPI 3: sweep atomicity 継承 + 5 module 固有障害シーケンス

CI 各 push で vlt/tests/e2e/sweep-audit-atomicity.test.ts が自動走行。3 種 orphan (KPI-9 継承) + 4 case (障害シーケンス 2 case 完了 · 残 2 case は it.todo 骨格) が全 green 保持。週次で最新 CI run を確認。

実行日CI 状態3 種 orphan4 case補足
Week 1YYYY-MM-DD✅ green全 pass2 pass + 2 todofollow-up: helper 拡張で 2 case を実装化

KPI 4: Phase 0 → Phase 1 caller 遷移追跡

SELECT DISTINCT phase, caller, COUNT(*) AS insert_count
  FROM audit_log
  WHERE action = 'retention_sweep_delete'
    AND created_at > NOW() - INTERVAL '30 days'
  GROUP BY phase, caller;
実行日phasecallerinsert_countSLO 判定
Month 1YYYY-MM-DD0lock-transaction-boundaryN✅ (Phase 0 100%)

関連 SSoT

  • ADR-0225 (sweep boundary に audit_log を同梱): docs/adr/0225-include-audit-log-in-sweep-boundary.md §9 Confirmation が本観測の SSoT
  • ADR-0223 (Retention Manager 運用実装): §3.3 仕様の責務外条項を Phase 0 限定 amend (ADR-0225 §8 撤退条件 1 で Phase 1 移送)
  • ADR-0203 §9-9 KPI-9 (sweep atomicity): 3 種 orphan 検出テストを継承
  • ADR-0222 (append-only 監査ログ物理担保): Phase 1 event-emitter 有効化と本 ADR の caller 遷移の SoT 統合
  • lint 配線: scripts/vlt-schema-lint.mjs (SCHEMA_RULES + WIRING_RULES に本 ADR §11 で 4 rule 追加)
  • 実装 SoT: vlt/src/retention-manager/lock-transaction-boundary.ts (audit_log INSERT の Phase 0 経路)