---
generated_at: 2026-01-28 11:00:00
metrics:
  claims_total: 35
  claims_with_evidence: 35
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート: 25-差分比較

## 概要

本レポートは「機能設計書 25-差分比較」に記載された内容の根拠を示す。各記述がソースコードのどの部分に基づいているかを明示する。

## 根拠一覧

### 1. 処理概要に関する根拠

| 主張 | 根拠ファイル | 該当行 | 根拠内容 |
|------|-------------|--------|----------|
| 2つのリビジョン間の差分データ取得 | DiffContainerViewController.swift | L786-814 | `fetchDiff()` で `diffController.fetchDiff()` 呼び出し |
| 差分リスト表示 | DiffContainerViewController.swift | L877-967 | `setupDiffListViewControllerIfNeeded()` で `DiffListViewController` 生成 |
| ヘッダーに記事・編集者情報表示 | DiffContainerViewController.swift | L301-309 | `populateNewHeaderViewModel()` で `DiffHeaderViewModel` 生成 |
| 前/次リビジョン移動 | DiffContainerViewController.swift | L1101-1142 | `tappedPrevious()`, `tappedNext()` で新DiffContainerVC生成 |
| 感謝送信 | DiffContainerViewController.swift | L1020-1040, L1175-1181 | `ThanksGiving` プロトコル実装と `tappedThankButton()` |
| Undo/Rollback | DiffContainerViewController.swift | L1206-1316 | `tappedUndo()`, `performUndo()`, `tappedRollback()`, `performRollback()` |
| 共有 | DiffContainerViewController.swift | L1144-1161 | `tappedShare()` で `UIActivityViewController` |
| ウォッチ操作 | DiffContainerViewController.swift | L1183-1202 | `tappedWatch()`, `tappedUnwatch()` で `WatchlistController` |

### 2. 入力パラメータに関する根拠

| パラメータ | 根拠ファイル | 該当行 | 根拠内容 |
|-----------|-------------|--------|----------|
| siteURL | DiffContainerViewController.swift | L42, L100 | `private let siteURL: URL` |
| fromRevisionID | DiffContainerViewController.swift | L39, L107 | `private var fromModelRevisionID: Int?` |
| toRevisionID | DiffContainerViewController.swift | L41, L106 | `private let toModelRevisionID: Int?` |
| articleTitle | DiffContainerViewController.swift | L44, L105 | `private var articleTitle: String?` |
| fromModel | DiffContainerViewController.swift | L38, L130 | `private var fromModel: WMFPageHistoryRevision?` |
| toModel | DiffContainerViewController.swift | L40, L131 | `private var toModel: WMFPageHistoryRevision?` |
| revisionRetrievingDelegate | DiffContainerViewController.swift | L49, L134 | `private let revisionRetrievingDelegate: DiffRevisionRetrieving?` |
| firstRevision | DiffContainerViewController.swift | L50, L138 | `private var firstRevision: WMFPageHistoryRevision?` |

### 3. 処理フローに関する根拠

| 処理ステップ | 根拠ファイル | 該当行 | 根拠内容 |
|-------------|-------------|--------|----------|
| startSetup | DiffContainerViewController.swift | L395-398 | `setupToolbarIfNeeded()`, `containerViewModel.state = .loading` |
| populateModelsFromDeepLink | DiffContainerViewController.swift | L315-337 | ディープリンクからモデル取得 |
| fetchFromModelAndFinishSetup | DiffContainerViewController.swift | L362-393 | fromModel取得と完了処理 |
| fetchToModelAndFinishSetup | DiffContainerViewController.swift | L339-360 | toModel取得と完了処理 |
| midSetup | DiffContainerViewController.swift | L400-412 | ヘッダーVM生成、DiffListVC設定等 |
| completeSetup | DiffContainerViewController.swift | L414-431 | 差分取得、前後モデル準備 |

### 4. ビジネスルールに関する根拠

| ルールNo | 根拠ファイル | 該当行 | 根拠内容 |
|---------|-------------|--------|----------|
| BR-001 | DiffContainerViewController.swift | L71-80 | `isOnFirstRevisionInHistory` プロパティ |
| BR-002 | DiffContainerViewController.swift | L82-91 | `isOnSecondRevisionInHistory` プロパティ |
| BR-003 | DiffContainerViewController.swift | L166-168 | `if self.isOnFirstRevisionInHistory { self.type = .single }` |
| BR-004 | DiffContainerViewController.swift | L60-68 | `prevModel`/`nextModel` didSetでボタン状態更新 |
| BR-005 | DiffContainerViewController.swift | L430 | `diffToolbarView?.undoButton.isEnabled = wmfProject != nil` |
| BR-006 | DiffContainerViewController.swift | L1176 | `let isUserAnonymous = toModel?.isAnon ?? true` |
| BR-007 | DiffContainerViewController.swift | L969-979 | `showDiffPanelOnce()` と `UserDefaults.standard.bool(forKey: "didShowDiffPanel")` |

### 5. 計算ロジックに関する根拠

| 計算項目 | 根拠ファイル | 該当行 | 根拠内容 |
|---------|-------------|--------|----------|
| バイト差分 | DiffContainerViewController.swift | L93-95 | `(toModel?.articleSizeAtRevision ?? 0) - (fromModel?.articleSizeAtRevision ?? 0)` |

### 6. API呼び出しに関する根拠

| API | 根拠ファイル | 該当行 | 根拠内容 |
|-----|-------------|--------|----------|
| fetchDiff | DiffContainerViewController.swift | L797 | `diffController.fetchDiff(...)` |
| fetchFirstRevisionDiff | DiffContainerViewController.swift | L753 | `diffController.fetchFirstRevisionDiff(...)` |
| fetchAdjacentRevisionModel | DiffContainerViewController.swift | L346, L378, L451, L488 | `diffController.fetchAdjacentRevisionModel(...)` |
| populateModelsFromDeepLink | DiffContainerViewController.swift | L321 | `diffController.populateModelsFromDeepLink(...)` |
| fetchArticleInfo | DiffContainerViewController.swift | L655 | `WMFArticleDataController().fetchArticleInfo(...)` |
| fetchEditCount | DiffContainerViewController.swift | L622 | `diffController.fetchEditCount(...)` |
| fetchLeadImageURL | DiffContainerViewController.swift | L684 | `diffController.fetchLeadImageURL(...)` |
| undo | DiffContainerViewController.swift | L1268 | `WMFWatchlistDataController().undo(...)` |
| rollback | DiffContainerViewController.swift | L1311 | `WMFWatchlistDataController().rollback(...)` |

### 7. 状態管理に関する根拠

| 状態 | 根拠ファイル | 該当行 | 根拠内容 |
|-----|-------------|--------|----------|
| loading | DiffContainerViewController.swift | L551-554 | `case .loading:` の処理 |
| empty | DiffContainerViewController.swift | L555-571 | `case .empty:` の処理 |
| error | DiffContainerViewController.swift | L572-583 | `case .error(let error):` の処理 |
| data | DiffContainerViewController.swift | L584-594 | `case .data:` の処理 |

### 8. ツールバーアクションに関する根拠

| アクション | 根拠ファイル | 該当行 | 根拠内容 |
|-----------|-------------|--------|----------|
| tappedPrevious | DiffContainerViewController.swift | L1101-1125 | 前リビジョン遷移処理 |
| tappedNext | DiffContainerViewController.swift | L1127-1142 | 次リビジョン遷移処理 |
| tappedShare | DiffContainerViewController.swift | L1144-1161 | UIActivityViewController表示 |
| tappedEditHistory | DiffContainerViewController.swift | L1163-1173 | PageHistoryViewController遷移 |
| tappedThankButton | DiffContainerViewController.swift | L1175-1181 | 感謝送信処理 |
| tappedWatch/Unwatch | DiffContainerViewController.swift | L1183-1202 | ウォッチ操作 |
| tappedUndo | DiffContainerViewController.swift | L1206-1249 | Undoアラート表示 |
| tappedRollback | DiffContainerViewController.swift | L1275-1298 | Rollbackアラート表示 |

### 9. Undo/Rollback完了処理に関する根拠

| 処理 | 根拠ファイル | 該当行 | 根拠内容 |
|------|-------------|--------|----------|
| 成功時の新差分画面遷移 | DiffContainerViewController.swift | L1333-1337 | `DiffContainerViewController` 生成と `replaceLastAndPush()` |
| 成功トースト | DiffContainerViewController.swift | L1339-1353 | `WMFAlertManager.sharedInstance.showSuccessAlert()` |
| ブロックエラー処理 | DiffContainerViewController.swift | L1402 | `wmf_showBlockedPanel()` |

## 根拠なし項目

なし - すべての主張にソースコードの根拠が確認できた。

## 信頼度評価

- **claims_total**: 35（処理概要8、入力8、処理フロー6、ビジネスルール7、計算1、API9、状態4、ツールバー8、完了処理3 - 重複除外後）
- **claims_with_evidence**: 35
- **claims_without_evidence**: 0
- **confidence_derived**: 35/35 = 1.00

## 検証方法

1. 各根拠ファイルの該当行を確認し、記述内容と一致することを検証
2. 状態遷移（loading→data/empty/error）が正確であることをコードトレースで確認
3. Undo/Rollbackの完了処理フローが設計書の記述と一致することを確認
