---
generated_at: 2026-03-01 10:30:00
metrics:
  claims_total: 200
  claims_with_evidence: 198
  claims_without_evidence: 2
confidence_derived: 0.99
---

# 根拠レポート：Auth モジュール 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.99**
  - 根拠あり：198 / 200、根拠なし：2
- 優先レビュー（高）
  1. **Gate::guessPolicyName の動作仕様**：ポリシー推測ロジックの複雑さ
  2. **Timebox機能の挙動**：タイミング攻撃対策の詳細仕様
  3. **イベント発火タイミング**：認証イベントの発火順序と条件

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

- E-01: `src/Illuminate/Auth/AuthManager.php` - 認証マネージャークラス（337行）
- E-02: `src/Illuminate/Auth/SessionGuard.php` - セッションガードクラス（1040行）
- E-03: `src/Illuminate/Auth/TokenGuard.php` - トークンガードクラス（135行）
- E-04: `src/Illuminate/Auth/RequestGuard.php` - リクエストガードクラス（87行）
- E-05: `src/Illuminate/Auth/GuardHelpers.php` - ガードヘルパートレイト（125行）
- E-06: `src/Illuminate/Auth/EloquentUserProvider.php` - Eloquentユーザープロバイダ（280行）
- E-07: `src/Illuminate/Auth/DatabaseUserProvider.php` - データベースユーザープロバイダ（187行）
- E-08: `src/Illuminate/Auth/Access/Gate.php` - 認可ゲートクラス（934行）
- E-09: `src/Illuminate/Auth/Access/Response.php` - 認可レスポンスクラス（216行）
- E-10: `src/Illuminate/Auth/Access/AuthorizationException.php` - 認可例外クラス（114行）
- E-11: `src/Illuminate/Auth/Passwords/PasswordBroker.php` - パスワードブローカークラス（243行）
- E-12: `src/Illuminate/Auth/Passwords/PasswordBrokerManager.php` - パスワードブローカーマネージャー（155行）
- E-13: `src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php` - DBトークンリポジトリ（198行）
- E-14: `src/Illuminate/Auth/Passwords/CacheTokenRepository.php` - キャッシュトークンリポジトリ（139行）
- E-15: `src/Illuminate/Auth/Middleware/Authenticate.php` - 認証ミドルウェア（132行）
- E-16: `src/Illuminate/Auth/Middleware/Authorize.php` - 認可ミドルウェア（108行）
- E-17: `src/Illuminate/Auth/Middleware/RedirectIfAuthenticated.php` - リダイレクトミドルウェア（93行）
- E-18: `src/Illuminate/Auth/Middleware/RequirePassword.php` - パスワード確認ミドルウェア（101行）
- E-19: `src/Illuminate/Auth/Middleware/EnsureEmailIsVerified.php` - メール確認ミドルウェア（44行）
- E-20: `src/Illuminate/Auth/Middleware/AuthenticateWithBasicAuth.php` - Basic認証ミドルウェア（59行）
- E-21: `src/Illuminate/Auth/Recaller.php` - Recallerクラス（96行）
- E-22: `src/Illuminate/Auth/GenericUser.php` - 汎用ユーザークラス（142行）
- E-23: `src/Illuminate/Auth/CreatesUserProviders.php` - ユーザープロバイダ生成トレイト（94行）
- E-24: `src/Illuminate/Auth/Authenticatable.php` - Authenticatableトレイト（106行）
- E-25: `src/Illuminate/Auth/MustVerifyEmail.php` - メール確認トレイト（63行）
- E-26: `src/Illuminate/Auth/AuthenticationException.php` - 認証例外クラス（84行）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | AuthManager::guard - デフォルトガード取得 | E-01 L65-70 | ○ |
| C-002 | AuthManager::guard - 指定ガード取得 | E-01 L65-70 | ○ |
| C-003 | AuthManager::guard - キャッシュ動作 | E-01 L69 | ○ |
| C-004 | AuthManager::resolve - 未定義ガード例外 | E-01 L80-86 | ○ |
| C-005 | AuthManager::resolve - 未定義ドライバ例外 | E-01 L98-100 | ○ |
| C-006 | AuthManager::createSessionDriver | E-01 L122-147 | ○ |
| C-007 | AuthManager::createTokenDriver | E-01 L156-172 | ○ |
| C-008 | AuthManager::shouldUse | E-01 L201-208 | ○ |
| C-009 | AuthManager::extend | E-01 L269-274 | ○ |
| C-010 | AuthManager::provider | E-01 L283-288 | ○ |
| C-011 | AuthManager::viaRequest | E-01 L228-237 | ○ |
| C-012 | AuthManager::hasResolvedGuards (true) | E-01 L295-298 | ○ |
| C-013 | AuthManager::hasResolvedGuards (false) | E-01 L295-298 | ○ |
| C-014 | AuthManager::forgetGuards | E-01 L305-310 | ○ |
| C-015 | SessionGuard::user - セッションから取得 | E-02 L171-207 | ○ |
| C-016 | SessionGuard::user - remember meから取得 | E-02 L196-204, L215-231 | ○ |
| C-017 | SessionGuard::user - キャッシュ動作 | E-02 L180-182 | ○ |
| C-018 | SessionGuard::user - ログアウト後null | E-02 L173-175 | ○ |
| C-019 | SessionGuard::user - 未認証時null | E-02 L171-207 | ○ |
| C-020 | SessionGuard::id | E-02 L254-263 | ○ |
| C-021 | SessionGuard::id - ログアウト後null | E-02 L256-258 | ○ |
| C-022 | SessionGuard::attempt - 成功 | E-02 L419-446 | ○ |
| C-023 | SessionGuard::attempt - remember me | E-02 L564-568 | ○ |
| C-024 | SessionGuard::attempt - パスワード不正 | E-02 L442-443 | ○ |
| C-025 | SessionGuard::attempt - ユーザー不在 | E-02 L424 | ○ |
| C-026 | SessionGuard::attemptWhen - 成功 | E-02 L456-480 | ○ |
| C-027 | SessionGuard::attemptWhen - コールバックfalse | E-02 L466-477 | ○ |
| C-028 | SessionGuard::once - 成功 | E-02 L271-286 | ○ |
| C-029 | SessionGuard::once - 失敗 | E-02 L283-285 | ○ |
| C-030 | SessionGuard::onceUsingId - 成功 | E-02 L294-303 | ○ |
| C-031 | SessionGuard::onceUsingId - 失敗 | E-02 L302 | ○ |
| C-032 | SessionGuard::validate - 成功 | E-02 L311-324 | ○ |
| C-033 | SessionGuard::validate - 失敗 | E-02 L311-324 | ○ |
| C-034 | SessionGuard::login | E-02 L557-576 | ○ |
| C-035 | SessionGuard::login - remember me | E-02 L564-568 | ○ |
| C-036 | SessionGuard::loginUsingId - 成功 | E-02 L539-548 | ○ |
| C-037 | SessionGuard::loginUsingId - 失敗 | E-02 L547 | ○ |
| C-038 | SessionGuard::logout | E-02 L650-671 | ○ |
| C-039 | SessionGuard::logout - トークンサイクル | E-02 L656-658, L723-728 | ○ |
| C-040 | SessionGuard::logoutCurrentDevice | E-02 L680-697 | ○ |
| C-041 | SessionGuard::logoutOtherDevices | E-02 L740-756 | ○ |
| C-042 | SessionGuard::logoutOtherDevices - パスワード不正 | E-02 L770-772 | ○ |
| C-043 | SessionGuard::basic - 成功 | E-02 L335-349 | ○ |
| C-044 | SessionGuard::basic - 失敗 | E-02 L407-410 | ○ |
| C-045 | SessionGuard::onceBasic | E-02 L360-367 | ○ |
| C-046 | SessionGuard::viaRemember - true | E-02 L894-897, L226-228 | ○ |
| C-047 | SessionGuard::viaRemember - false | E-02 L894-897 | ○ |
| C-048 | SessionGuard::getCookieJar - 例外 | E-02 L929-936 | ○ |
| C-049 | SessionGuard::setRememberDuration | E-02 L915-920 | ○ |
| C-050 | TokenGuard::user - 成功 | E-03 L70-90 | ○ |
| C-051 | TokenGuard::user - 失敗 | E-03 L83-87 | ○ |
| C-052 | TokenGuard::user - 空トークン | E-03 L83 | ○ |
| C-053 | TokenGuard::getTokenForRequest - query | E-03 L97-103 | ○ |
| C-054 | TokenGuard::getTokenForRequest - input | E-03 L100 | ○ |
| C-055 | TokenGuard::getTokenForRequest - bearer | E-03 L101 | ○ |
| C-056 | TokenGuard::validate - 成功 | E-03 L111-120 | ○ |
| C-057 | TokenGuard::validate - 失敗 | E-03 L113-115 | ○ |
| C-058 | TokenGuard::validate - 空トークン | E-03 L113-115 | ○ |
| C-059 | RequestGuard::user - 成功 | E-04 L47-59 | ○ |
| C-060 | RequestGuard::user - キャッシュ | E-04 L52-54 | ○ |
| C-061 | RequestGuard::validate | E-04 L67-72 | ○ |
| C-062 | GuardHelpers::authenticate - 成功 | E-05 L34-37 | ○ |
| C-063 | GuardHelpers::authenticate - 例外 | E-05 L36 | ○ |
| C-064 | GuardHelpers::check - true | E-05 L54-57 | ○ |
| C-065 | GuardHelpers::check - false | E-05 L54-57 | ○ |
| C-066 | GuardHelpers::guest - true | E-05 L64-67 | ○ |
| C-067 | GuardHelpers::guest - false | E-05 L64-67 | ○ |
| C-068 | GuardHelpers::hasUser - true | E-05 L44-47 | ○ |
| C-069 | GuardHelpers::hasUser - false | E-05 L44-47 | ○ |
| C-070 | GuardHelpers::forgetUser | E-05 L97-102 | ○ |
| C-071 | EloquentUserProvider::retrieveById - 成功 | E-06 L52-59 | ○ |
| C-072 | EloquentUserProvider::retrieveById - 失敗 | E-06 L52-59 | ○ |
| C-073 | EloquentUserProvider::retrieveByToken - 成功 | E-06 L68-83 | ○ |
| C-074 | EloquentUserProvider::retrieveByToken - トークン不正 | E-06 L82 | ○ |
| C-075 | EloquentUserProvider::retrieveByToken - ID不在 | E-06 L76-78 | ○ |
| C-076 | EloquentUserProvider::updateRememberToken | E-06 L92-103 | ○ |
| C-077 | EloquentUserProvider::retrieveByCredentials - 成功 | E-06 L111-139 | ○ |
| C-078 | EloquentUserProvider::retrieveByCredentials - password除外 | E-06 L113-117 | ○ |
| C-079 | EloquentUserProvider::retrieveByCredentials - 空 | E-06 L119-121 | ○ |
| C-080 | EloquentUserProvider::retrieveByCredentials - 配列値 | E-06 L129-130 | ○ |
| C-081 | EloquentUserProvider::validateCredentials - 成功 | E-06 L148-159 | ○ |
| C-082 | EloquentUserProvider::validateCredentials - 失敗 | E-06 L158 | ○ |
| C-083 | EloquentUserProvider::validateCredentials - nullパスワード | E-06 L150-152 | ○ |
| C-084 | EloquentUserProvider::validateCredentials - DBパスワードnull | E-06 L154-156 | ○ |
| C-085 | EloquentUserProvider::rehashPasswordIfRequired - 必要 | E-06 L169-178 | ○ |
| C-086 | EloquentUserProvider::rehashPasswordIfRequired - 不要 | E-06 L171-173 | ○ |
| C-087 | EloquentUserProvider::rehashPasswordIfRequired - force | E-06 L171 | ○ |
| C-088 | DatabaseUserProvider::retrieveById - 成功 | E-07 L55-60 | ○ |
| C-089 | DatabaseUserProvider::retrieveById - 失敗 | E-07 L55-60 | ○ |
| C-090 | DatabaseUserProvider::retrieveByToken - 成功 | E-07 L69-78 | ○ |
| C-091 | DatabaseUserProvider::retrieveByToken - 失敗 | E-07 L75-77 | ○ |
| C-092 | DatabaseUserProvider::validateCredentials - 成功 | E-07 L155-166 | ○ |
| C-093 | DatabaseUserProvider::validateCredentials - 失敗 | E-07 L155-166 | ○ |
| C-094 | Gate::has - 存在 | E-08 L123-134 | ○ |
| C-095 | Gate::has - 不在 | E-08 L128-129 | ○ |
| C-096 | Gate::has - 複数存在 | E-08 L125-133 | ○ |
| C-097 | Gate::has - 複数一部不在 | E-08 L125-133 | ○ |
| C-098 | Gate::define - callable | E-08 L203-222 | ○ |
| C-099 | Gate::define - string | E-08 L213-216 | ○ |
| C-100 | Gate::define - 無効コールバック例外 | E-08 L217-218 | ○ |
| C-101 | Gate::allows - 許可 | E-08 L332-335 | ○ |
| C-102 | Gate::allows - 拒否 | E-08 L332-335 | ○ |
| C-103 | Gate::denies - 拒否 | E-08 L344-347 | ○ |
| C-104 | Gate::denies - 許可 | E-08 L344-347 | ○ |
| C-105 | Gate::check - 全許可 | E-08 L356-361 | ○ |
| C-106 | Gate::check - 一部拒否 | E-08 L356-361 | ○ |
| C-107 | Gate::any - 一部許可 | E-08 L370-373 | ○ |
| C-108 | Gate::any - 全拒否 | E-08 L370-373 | ○ |
| C-109 | Gate::none | E-08 L382-385 | ○ |
| C-110 | Gate::authorize - 許可 | E-08 L396-399 | ○ |
| C-111 | Gate::authorize - 拒否例外 | E-08 L396-399 | ○ |
| C-112 | Gate::inspect - 許可 | E-08 L408-423 | ○ |
| C-113 | Gate::inspect - 拒否 | E-08 L408-423 | ○ |
| C-114 | Gate::before | E-08 L305-310, L564-575 | ○ |
| C-115 | Gate::before - 結果上書き | E-08 L571-573 | ○ |
| C-116 | Gate::after | E-08 L318-323, L586-599 | ○ |
| C-117 | Gate::policy | E-08 L292-297 | ○ |
| C-118 | Gate::getPolicyFor - 登録済み | E-08 L659-690 | ○ |
| C-119 | Gate::getPolicyFor - 推測 | E-08 L717-737 | △ |
| C-120 | Gate::forUser | E-08 L865-876 | ○ |
| C-121 | Gate::allowIf - true | E-08 L146-149 | ○ |
| C-122 | Gate::allowIf - false | E-08 L146-149 | ○ |
| C-123 | Gate::denyIf - true | E-08 L161-164 | ○ |
| C-124 | Gate::denyIf - false | E-08 L161-164 | ○ |
| C-125 | Response::allow | E-09 L59-62 | ○ |
| C-126 | Response::deny | E-09 L71-74 | ○ |
| C-127 | Response::allowed | E-09 L106-109 | ○ |
| C-128 | Response::denied | E-09 L116-119 | ○ |
| C-129 | Response::authorize - 許可 | E-09 L148-157 | ○ |
| C-130 | Response::authorize - 拒否例外 | E-09 L150-154 | ○ |
| C-131 | Response::denyWithStatus | E-09 L84-87 | ○ |
| C-132 | Response::denyAsNotFound | E-09 L96-99 | ○ |
| C-133 | PasswordBroker::sendResetLink - 成功 | E-11 L82-113 | ○ |
| C-134 | PasswordBroker::sendResetLink - ユーザー不在 | E-11 L90-92 | ○ |
| C-135 | PasswordBroker::sendResetLink - スロットル | E-11 L94-96 | ○ |
| C-136 | PasswordBroker::reset - 成功 | E-11 L122-147 | ○ |
| C-137 | PasswordBroker::reset - 無効トークン | E-11 L161-163 | ○ |
| C-138 | PasswordBroker::reset - ユーザー不在 | E-11 L157-159 | ○ |
| C-139 | PasswordBroker::getUser - 成功 | E-11 L176-187 | ○ |
| C-140 | PasswordBroker::getUser - 例外 | E-11 L182-184 | ○ |
| C-141 | PasswordBroker::createToken | E-11 L195-198 | ○ |
| C-142 | PasswordBroker::deleteToken | E-11 L206-209 | ○ |
| C-143 | PasswordBroker::tokenExists - true | E-11 L218-221 | ○ |
| C-144 | PasswordBroker::tokenExists - false | E-11 L218-221 | ○ |
| C-145 | DatabaseTokenRepository::create | E-13 L35-49 | ○ |
| C-146 | DatabaseTokenRepository::create - 既存削除 | E-13 L39 | ○ |
| C-147 | DatabaseTokenRepository::exists - 有効 | E-13 L81-90 | ○ |
| C-148 | DatabaseTokenRepository::exists - 期限切れ | E-13 L88, L98-101 | ○ |
| C-149 | DatabaseTokenRepository::exists - 不正 | E-13 L89 | ○ |
| C-150 | DatabaseTokenRepository::recentlyCreatedToken - true | E-13 L109-116 | ○ |
| C-151 | DatabaseTokenRepository::recentlyCreatedToken - false | E-13 L109-116 | ○ |
| C-152 | DatabaseTokenRepository::recentlyCreatedToken - throttle=0 | E-13 L126-128 | ○ |
| C-153 | DatabaseTokenRepository::delete | E-13 L141-144 | ○ |
| C-154 | DatabaseTokenRepository::deleteExpired | E-13 L151-156 | ○ |
| C-155 | CacheTokenRepository::create | E-14 L36-49 | ○ |
| C-156 | CacheTokenRepository::exists | E-14 L58-65 | ○ |
| C-157 | CacheTokenRepository::delete | E-14 L114-117 | ○ |
| C-158 | PasswordBrokerManager::broker - デフォルト | E-12 L43-48 | ○ |
| C-159 | PasswordBrokerManager::broker - 指定 | E-12 L43-48 | ○ |
| C-160 | PasswordBrokerManager::broker - キャッシュ | E-12 L47 | ○ |
| C-161 | PasswordBrokerManager::resolve - 未定義例外 | E-12 L62-64 | ○ |
| C-162 | Authenticate::handle - 認証済み | E-15 L59-64 | ○ |
| C-163 | Authenticate::handle - 未認証例外 | E-15 L99-106 | ○ |
| C-164 | Authenticate::handle - 複数ガード | E-15 L81-85 | ○ |
| C-165 | Authenticate::using | E-15 L44-47 | ○ |
| C-166 | Authorize::handle - 認可済み | E-16 L55-60 | ○ |
| C-167 | Authorize::handle - 認可失敗例外 | E-16 L57 | ○ |
| C-168 | Authorize::using | E-16 L38-41 | ○ |
| C-169 | RedirectIfAuthenticated::handle - 認証済み | E-17 L37-48 | ○ |
| C-170 | RedirectIfAuthenticated::handle - 未認証 | E-17 L47 | ○ |
| C-171 | RequirePassword::handle - 確認済み | E-18 L70-85 | ○ |
| C-172 | RequirePassword::handle - 未確認リダイレクト | E-18 L79-81 | ○ |
| C-173 | RequirePassword::handle - 未確認JSON | E-18 L73-76 | ○ |
| C-174 | EnsureEmailIsVerified::handle - 確認済み | E-19 L31-42 | ○ |
| C-175 | EnsureEmailIsVerified::handle - 未確認リダイレクト | E-19 L38 | ○ |
| C-176 | EnsureEmailIsVerified::handle - 未確認JSON | E-19 L37 | ○ |
| C-177 | AuthenticateWithBasicAuth::handle - 成功 | E-20 L52-57 | ○ |
| C-178 | AuthenticateWithBasicAuth::handle - 失敗 | E-20 L54 | ○ |
| C-179 | Recaller::id | E-21 L29-32 | ○ |
| C-180 | Recaller::token | E-21 L39-42 | ○ |
| C-181 | Recaller::hash | E-21 L49-52 | ○ |
| C-182 | Recaller::valid - 有効 | E-21 L59-62 | ○ |
| C-183 | Recaller::valid - セグメント不足 | E-21 L79-83 | ○ |
| C-184 | Recaller::valid - パイプなし | E-21 L69-72 | ○ |
| C-185 | Recaller::valid - 空ID | E-21 L83 | ○ |
| C-186 | GenericUser::getAuthIdentifier | E-22 L40-44 | ○ |
| C-187 | GenericUser::getAuthPassword | E-22 L61-64 | ○ |
| C-188 | GenericUser::getRememberToken | E-22 L71-74 | ○ |
| C-189 | GenericUser::setRememberToken | E-22 L82-85 | ○ |
| C-190 | GenericUser::__get | E-22 L103-106 | ○ |
| C-191 | GenericUser::__set | E-22 L115-118 | ○ |
| C-192 | Authenticatable::getAuthIdentifierName | E-24 L26-29 | ○ |
| C-193 | Authenticatable::getAuthIdentifier | E-24 L36-39 | ○ |
| C-194 | Authenticatable::getRememberToken | E-24 L76-81 | ○ |
| C-195 | Authenticatable::getRememberToken - 空名 | E-24 L78-80 | ○ |
| C-196 | MustVerifyEmail::hasVerifiedEmail - true | E-25 L14-17 | ○ |
| C-197 | MustVerifyEmail::hasVerifiedEmail - false | E-25 L14-17 | ○ |
| C-198 | MustVerifyEmail::markEmailAsVerified | E-25 L24-29 | ○ |
| C-199 | MustVerifyEmail::markEmailAsUnverified | E-25 L36-41 | ○ |
| C-200 | AuthenticationException::guards | E-26 L50-53 | ○ |

## 4) 不足情報（Unknown / Missing）

- **Gate::guessPolicyName（C-119）**：ポリシー推測ロジックは複雑で、複数のディレクトリ構造パターンを試行する。すべてのパターンが網羅的にテストされているか要確認。
  - 候補：Modelsディレクトリ内のモデル / ネストされた名前空間 / カスタムguessPolicyNamesUsingCallback

- **Timebox機能の詳細挙動**：タイミング攻撃対策として導入されているが、実際の遅延動作の詳細テストは実装依存
  - 候補：固定時間実行 / returnEarly時の挙動 / 例外発生時の挙動

## 5) リスクフラグ（レビュー観点）

| リスク | 対象 | 説明 |
|--------|------|------|
| 1 | SessionGuard認証ロジック | セキュリティ上重要な認証処理。タイミング攻撃対策、パスワード検証の網羅性を確認 |
| 1 | Gate認可ロジック | 権限チェックの漏れがセキュリティリスクに直結。before/afterコールバックの優先順位を確認 |
| 1 | PasswordBroker | パスワードリセット機能。トークンの有効期限、スロットル処理の正確性を確認 |
| 0 | ミドルウェア全般 | HTTPリクエストの制御。リダイレクト先やJSONレスポンスの内容を確認 |
| 0 | UserProvider | ユーザー取得・検証。SQLインジェクション対策はフレームワーク側で対応済み |

## 6) レビュアーチェックリスト（最小）

- [ ] セキュリティ関連のテストケース（認証失敗、パスワード検証失敗、トークン期限切れ）が網羅されているか
- [ ] 境界値テスト（空配列、空文字列、null）が各メソッドで考慮されているか
- [ ] 異常系テスト（例外スロー、無効な入力）が適切にカバーされているか
- [ ] イベント発火（Attempting, Login, Logout, Failed等）のテストが含まれているか
- [ ] Remember Me機能のトークン生成・検証・更新のテストが網羅されているか
- [ ] パスワードリセット機能のスロットル制限が正しくテストされているか
- [ ] Gate/Policyの権限チェックにおけるbefore/afterコールバックの優先順位が明確か
