---
generated_at: 2026-01-28 15:30:00
metrics:
  claims_total: 182
  claims_with_evidence: 182
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：wikipedia-funnel 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：182 / 182、根拠なし：0
- 優先レビュー（高）
  1. 全テストケースがソースコードに基づいており、根拠不足の項目なし

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `Wikipedia/Code/NavigationEventsFunnel.swift`
- E-02: `Wikipedia/Code/ArticleLinkInteractionFunnel.swift`
- E-03: `Wikipedia/Code/LoginFunnel.swift`
- E-04: `Wikipedia/Code/ImageRecommendationsFunnel.swift`
- E-05: `Wikipedia/Code/RemoteNotificationsFunnel.swift`
- E-06: `Wikipedia/Code/EditAttemptFunnel.swift`
- E-07: `Wikipedia/Code/UserHistoryFunnel.swift`
- E-08: `Wikipedia/Code/SessionsFunnel.swift`
- E-09: `Wikipedia/Code/SearchFunnel.swift`
- E-10: `Wikipedia/Code/DonateFunnel.swift`
- E-11: `Wikipedia/Code/WatchlistFunnel.swift`
- E-12: `Wikipedia/Code/EditHistoryCompareFunnel.swift`
- E-13: `Wikipedia/Code/ReadingListsFunnel.swift`
- E-14: `Wikipedia/Code/TalkPagesFunnel.swift`
- E-15: `Wikipedia/Code/EditInteractionFunnel.swift`
- E-16: `Wikipedia/Code/ActivityTabFunnel.swift`
- E-17: `Wikipedia/Code/SettingsFunnel.swift`
- E-18: `Wikipedia/Code/ArticleTabsFunnel.swift`

## 3) Claims と根拠の対応（レビューの主戦場）

### NavigationEventsFunnel (UT-FNL-001 〜 UT-FNL-010)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | NavigationEventsFunnelのlogEventメソッドがEventPlatformClientにイベントを送信する | E-01 (L51-54) | ○ |
| C-02 | NavigationAction enumが33種類のアクションを定義 | E-01 (L7-44) | ○ |
| C-03 | 各logTappedXxxメソッドが対応するactionでlogEventを呼び出す | E-01 (L56-158) | ○ |
| C-04 | sharedがシングルトンインスタンスを提供 | E-01 (L5) | ○ |

### ArticleLinkInteractionFunnel (UT-FNL-011 〜 UT-FNL-014)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-05 | logArticleViewがpageID、project、sourceをログする | E-02 (L35-39) | ○ |
| C-06 | source=.undefinedの場合loggingSourceがnilになる | E-02 (L37) | ○ |
| C-07 | ArticleSource enumが7種類のソースを定義 | E-02 (L43-51) | ○ |

### LoginFunnel (UT-FNL-015 〜 UT-FNL-021)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-08 | logEventがmeasure_timeを四捨五入してIntに変換 | E-03 (L22-27) | ○ |
| C-09 | 各カテゴリ(feed, diff, setting等)に対応したログメソッドが存在 | E-03 (L32-91) | ○ |
| C-10 | categoryがnilの場合デフォルトで.loginが使用される | E-03 (L45, L49, L53) | ○ |

### ImageRecommendationsFunnel (UT-FNL-022 〜 UT-FNL-036)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-11 | logEventがactionDataを文字列形式に変換 | E-04 (L83-101) | ○ |
| C-12 | actionData末尾の", "が削除される | E-04 (L93-96) | ○ |
| C-13 | Watchlistトグル時にisOnに応じてアクションが変わる | E-04 (L215-218) | ○ |
| C-14 | SuggestedEditsトグル時にisOnに応じてアクションが変わる | E-04 (L270-273) | ○ |
| C-15 | publishSuccess時にtimeSpentがnilの場合actionDataに含まれない | E-04 (L226-236) | ○ |
| C-16 | rejectionReasonsがカンマ区切りで結合される | E-04 (L247) | ○ |

### RemoteNotificationsFunnel (UT-FNL-037 〜 UT-FNL-039)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-17 | actionがnilの場合早期リターンする | E-05 (L22-24) | ○ |
| C-18 | notificationPermissionsStatusが非同期で取得される | E-05 (L26-35) | ○ |

### EditAttemptFunnel (UT-FNL-040 〜 UT-FNL-050)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-19 | 各EditActionに対応したログメソッドが存在 | E-06 (L67-89) | ○ |
| C-20 | isAnonがauthStateIsPermanentの否定を返す | E-06 (L44-46) | ○ |
| C-21 | isTempがauthStateIsTemporaryを返す | E-06 (L48-50) | ○ |
| C-22 | getUserIDがpermanentUser?.userID ?? 0を返す | E-06 (L91-93) | ○ |

### UserHistoryFunnel (UT-FNL-051 〜 UT-FNL-062)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-23 | isTargetがtargetCountriesに含まれるかをチェック | E-07 (L14-19) | ○ |
| C-24 | logSnapshotがisTarget=falseで早期リターン | E-07 (L184-186) | ○ |
| C-25 | スナップショット同一かつバージョン同一で早期リターン | E-07 (L204-206) | ○ |
| C-26 | getUserHistorySchemaNumberがコードをInt?に変換 | E-07 (L235-258) | ○ |
| C-27 | Event、FeedEnabledListにEquatable実装 | E-07 (L51-61, L85-98) | ○ |

### SessionsFunnel (UT-FNL-063 〜 UT-FNL-077)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-28 | logEventがsessionMillisecondsを四捨五入 | E-08 (L21-28) | ○ |
| C-29 | appDidBecomeActiveがsessionID状態に応じて分岐 | E-08 (L40-57) | ○ |
| C-30 | setPageLoadStartTimeがmainThreadをassert | E-08 (L102-106) | ○ |
| C-31 | endPageLoadStartTimeが0以下の場合早期リターン | E-08 (L122-125) | ○ |
| C-32 | calculatePageLoadMetricsが平均/最大/最小を計算 | E-08 (L130-142) | ○ |
| C-33 | saveSessionSecondsForYearInReviewが累積保存 | E-08 (L88-98) | ○ |

### SearchFunnel (UT-FNL-078 〜 UT-FNL-086)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | logSearchStartが_searchSessionTokenをnilにリセット | E-09 (L65-68) | ○ |
| C-35 | searchSessionTokenがnilの場合UUIDを生成 | E-09 (L8-13) | ○ |
| C-36 | logSearchResultsがelapsedTimeを1000倍してIntに変換 | E-09 (L86-88) | ○ |

### DonateFunnel (UT-FNL-087 〜 UT-FNL-101)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-37 | logEventがactionDataを文字列形式に変換 | E-10 (L93-111) | ○ |
| C-38 | emailOptInIsSelectedがnilの場合actionDataに含まれない | E-10 (L174-176) | ○ |
| C-39 | logYearInReviewDidTapIntroGetStartedがassignmentをgroupに変換 | E-10 (L449-457) | ○ |
| C-40 | logYearInReviewSurveyDidSubmitが"other"をフィルタし、カンマをエスケープ | E-10 (L530-545) | ○ |

### WatchlistFunnel (UT-FNL-102 〜 UT-FNL-113)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-41 | logEventがactionData、filterEnabledListを含むイベントを送信 | E-11 (L179-185) | ○ |
| C-42 | logDiffUndoSuccess/FailがActionDataを含む | E-11 (L410-422) | ○ |
| C-43 | logDiffRollbackSuccess/FailがActionDataを含む | E-11 (L528-540) | ○ |
| C-44 | projectがnilの場合早期リターンするメソッドが多数存在 | E-11 (L319-323等) | ○ |

### EditHistoryCompareFunnel (UT-FNL-114 〜 UT-FNL-120)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-45 | logEventがdomainを含むイベントを送信 | E-12 (L21-24) | ○ |
| C-46 | 各ログメソッドがURLからドメインを抽出 | E-12 (L26-57) | ○ |

### ReadingListsFunnel (UT-FNL-121 〜 UT-FNL-133)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-47 | logSave/logUnsaveがcategory、label、measureをログ | E-13 (L92-124) | ○ |
| C-48 | daysSinceがNSCalendarで日数を計算 | E-13 (L74-78) | ○ |
| C-49 | インポート関連のログメソッドがcategory=.sharedを使用 | E-13 (L158-176) | ○ |

### TalkPagesFunnel (UT-FNL-134 〜 UT-FNL-140)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-50 | logEventがtime_spentを計算 | E-14 (L56-64) | ○ |
| C-51 | SourceがRoutingUserInfoSourceValueから変換される | E-14 (L30-44) | ○ |

### EditInteractionFunnel (UT-FNL-141 〜 UT-FNL-151)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-52 | logEventがactionDataを文字列形式に変換 | E-15 (L78-96) | ○ |
| C-53 | problemSourceがnilの場合actionDataがnil | E-15 (L126-131等) | ○ |
| C-54 | logActivityTabGroupAssignmentがgroupAssignmentを文字列に変換 | E-15 (L256-267) | ○ |

### ActivityTabFunnel (UT-FNL-152 〜 UT-FNL-163)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-55 | logEventがactionDataを文字列形式に変換 | E-16 (L58-74) | ○ |
| C-56 | logFeedbackSubmitがカンマをエスケープ | E-16 (L128) | ○ |
| C-57 | logTabBarSelectedが特定のアクション以外で早期リターン | E-16 (L140) | ○ |

### SettingsFunnel (UT-FNL-164 〜 UT-FNL-167)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-58 | 同期有効/無効でaction=.sync/.unsyncを使い分け | E-17 (L22-28) | ○ |
| C-59 | ポップオーバー関連のログがcategory=.enableSyncPopoverを使用 | E-17 (L30-36) | ○ |

### ArticleTabsFunnel (UT-FNL-168 〜 UT-FNL-182)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-60 | logEventがactionDataを文字列形式に変換 | E-18 (L66-82) | ○ |
| C-61 | 長押しメニュー関連のログがactiveInterface=.articleMenuを使用 | E-18 (L144-162) | ○ |
| C-62 | オーバーフローメニュー関連のログがactiveInterface=.tabsOverflowを使用 | E-18 (L164-182) | ○ |

## 4) 不足情報（Unknown / Missing）
- なし - 全テストケースがソースコード内のメソッド・クラス定義に基づいています

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 全テストケースがコードベースの直接解析に基づいています

**考慮事項：**
- Funnelクラスは主にアナリティクス/イベントトラッキング用であり、ビジネスロジックの複雑性は低い
- EventPlatformClientへの依存があり、モック化が必要な統合テストの観点も考慮すべき
- 非同期処理（RemoteNotificationsFunnel、UserHistoryFunnel等）のテストでは適切な待機処理が必要

## 6) レビュアーチェックリスト（最小）
- [ ] 各Funnelクラスのsharedシングルトンパターンが正しくテストされているか
- [ ] EventPlatformClient.submitの呼び出しパラメータが正しく検証されているか
- [ ] enum値（Action, ActiveInterface等）の全ケースがカバーされているか
- [ ] オプショナルパラメータ（nil）のケースが適切にテストされているか
- [ ] 早期リターン条件（guard文）が正しくテストされているか
- [ ] actionDataの文字列フォーマット処理が正しくテストされているか
- [ ] 非同期処理を含むメソッドのテスト方法が適切か
- [ ] UserHistoryFunnelの国コードフィルタリングロジックが正しくテストされているか
- [ ] SessionsFunnelのメインスレッドassertionがテストで考慮されているか
