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

# 根拠レポート：activestorage.csv

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.99**
  - 根拠あり：218 / 220、根拠なし：2
- 優先レビュー（高）
  1. **UT-AST-061（VideoAnalyzer#metadata）**：ffprobeの実行結果に依存、環境差異の可能性
  2. **UT-AST-073（VideoPreviewer#preview）**：ffmpegの実行結果に依存、環境差異の可能性

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

- E-01: `lib/active_storage/service.rb`
- E-02: `lib/active_storage/service/disk_service.rb`
- E-03: `lib/active_storage/service/mirror_service.rb`
- E-04: `lib/active_storage/service/s3_service.rb`
- E-05: `lib/active_storage/service/gcs_service.rb`
- E-06: `lib/active_storage/service/configurator.rb`
- E-07: `lib/active_storage/service/registry.rb`
- E-08: `lib/active_storage/analyzer.rb`
- E-09: `lib/active_storage/analyzer/video_analyzer.rb`
- E-10: `lib/active_storage/analyzer/image_analyzer.rb`
- E-11: `lib/active_storage/analyzer/audio_analyzer.rb`
- E-12: `lib/active_storage/previewer.rb`
- E-13: `lib/active_storage/previewer/video_previewer.rb`
- E-14: `lib/active_storage/previewer/mupdf_previewer.rb`
- E-15: `lib/active_storage/previewer/poppler_pdf_previewer.rb`
- E-16: `lib/active_storage/attached.rb`
- E-17: `lib/active_storage/attached/one.rb`
- E-18: `lib/active_storage/attached/many.rb`
- E-19: `lib/active_storage/attached/model.rb`
- E-20: `lib/active_storage/attached/changes.rb`
- E-21: `lib/active_storage/attached/changes/create_one.rb`
- E-22: `lib/active_storage/attached/changes/create_many.rb`
- E-23: `lib/active_storage/fixture_set.rb`
- E-24: `lib/active_storage/transformers/transformer.rb`
- E-25: `lib/active_storage/transformers/image_processing_transformer.rb`
- E-26: `lib/active_storage/reflection.rb`
- E-27: `lib/active_storage/log_subscriber.rb`
- E-28: `lib/active_storage/errors.rb`
- E-29: `app/models/active_storage/blob.rb`
- E-30: `app/models/active_storage/attachment.rb`
- E-31: `app/models/active_storage/variant.rb`
- E-32: `app/models/active_storage/variation.rb`
- E-33: `app/models/active_storage/filename.rb`
- E-34: `app/models/active_storage/preview.rb`
- E-35: `lib/active_storage.rb`

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

### Service関連（UT-AST-001〜017）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | Service#uploadはNotImplementedErrorを発生させる抽象メソッド | E-01 (L70-72) | ○ |
| C-02 | Service#uploadでchecksumが一致しない場合IntegrityError | E-01 (L69), E-28 | ○ |
| C-03 | Service#downloadはNotImplementedErrorを発生させる抽象メソッド | E-01 (L81-83) | ○ |
| C-04 | Service#download_chunkは部分ダウンロードを提供 | E-01 (L85-88) | ○ |
| C-05 | Service#deleteは削除を行う抽象メソッド | E-01 (L99-102) | ○ |
| C-06 | Service#delete_prefixedは接頭辞マッチする削除 | E-01 (L104-107) | ○ |
| C-07 | Service#exist?は存在確認を行う抽象メソッド | E-01 (L109-112) | ○ |
| C-08 | Service#urlはpublic/privateで異なるURLを生成 | E-01 (L114-131) | ○ |
| C-09 | Service#url_for_direct_uploadは署名付きURL生成 | E-01 (L133-139) | ○ |
| C-10 | Service#compute_checksumはMD5 base64を返す | E-01 (L154-169) | ○ |
| C-11 | Service#compute_checksumはrewindable ioを要求 | E-01 (L155) | ○ |
| C-12 | Service#public?は@publicを返す | E-01 (L146-148) | ○ |

### DiskService関連（UT-AST-017〜027）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-13 | DiskService#initializeはroot/publicを設定 | E-02 (L16-19) | ○ |
| C-14 | DiskService#uploadはIO.copy_streamでファイル保存 | E-02 (L21-26) | ○ |
| C-15 | DiskService#uploadはchecksum検証でIntegrityError | E-02 (L163-170) | ○ |
| C-16 | DiskService#downloadはFile.binreadで全体読込 | E-02 (L28-39) | ○ |
| C-17 | DiskService#downloadはブロックでストリーミング | E-02 (L29-32, L145-153) | ○ |
| C-18 | DiskService#downloadはErrno::ENOENTでFileNotFoundError | E-02 (L36-38) | ○ |
| C-19 | DiskService#download_chunkはrange指定で部分読込 | E-02 (L42-51) | ○ |
| C-20 | DiskService#path_forは2階層ディレクトリ構造 | E-02 (L101-103, L155-157) | ○ |
| C-21 | DiskService#composeは複数ファイル結合 | E-02 (L105-113) | ○ |
| C-22 | DiskService#url_for_direct_uploadは署名付きURL生成 | E-02 (L77-95) | ○ |
| C-23 | DiskService#headers_for_direct_uploadはContent-Type返却 | E-02 (L97-99) | ○ |

### MirrorService関連（UT-AST-028〜033）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-24 | MirrorService#initializeはprimary/mirrors設定 | E-03 (L30-39) | ○ |
| C-25 | MirrorService#uploadはprimaryに同期アップロード | E-03 (L45-49) | ○ |
| C-26 | MirrorService#uploadはmirrorsにMirrorJobで非同期 | E-03 (L48, L61-63) | ○ |
| C-27 | MirrorService#mirrorは未存在ファイルのみコピー | E-03 (L66-77) | ○ |
| C-28 | MirrorService#deleteは全サービスから削除 | E-03 (L52-54) | ○ |
| C-29 | MirrorService#downloadはprimaryに委譲 | E-03 (L17) | ○ |

### S3Service関連（UT-AST-034〜042）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 | S3Service#initializeはAWS SDK初期化 | E-04 (L17-30) | ○ |
| C-31 | S3Service#uploadはmultipart_upload_thresholdで分岐 | E-04 (L32-42) | ○ |
| C-32 | S3Service#uploadはBadDigestでIntegrityError | E-04 (L190-191) | ○ |
| C-33 | S3Service#downloadはNoSuchKeyでFileNotFoundError | E-04 (L52-53) | ○ |
| C-34 | S3Service#compute_checksumはdigest_typeでプレフィックス | E-04 (L123-125) | ○ |
| C-35 | S3Service#checksum_implementationは未サポートでIntegrityError | E-04 (L140-141) | ○ |

### GCSService関連（UT-AST-043〜048）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-36 | GCSService#initializeはGCP設定初期化 | E-05 (L16-19) | ○ |
| C-37 | GCSService#uploadはbucket.create_file | E-05 (L21-31) | ○ |
| C-38 | GCSService#uploadはInvalidArgumentErrorでIntegrityError | E-05 (L29-30) | ○ |
| C-39 | GCSService#update_metadataはファイルメタデータ更新 | E-05 (L48-56) | ○ |
| C-40 | GCSService#downloadはNotFoundErrorでFileNotFoundError | E-05 (L42-43) | ○ |
| C-41 | GCSService#composeはbucket.compose | E-05 (L139-145) | ○ |

### Configurator/Registry関連（UT-AST-049〜055）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-42 | Configurator.buildは設定からサービス構築 | E-06 (L7-9, L15-19) | ○ |
| C-43 | Configurator.buildは存在しないサービス名でRuntimeError | E-06 (L30-32) | ○ |
| C-44 | Configurator.buildは存在しないアダプタでLoadError | E-06 (L35-40) | ○ |
| C-45 | Registry#fetchはキャッシュ済みサービス返却 | E-07 (L10-23) | ○ |
| C-46 | Registry#fetchは未構築サービス構築 | E-07 (L12-14) | ○ |
| C-47 | Registry#fetchは存在しないサービスでKeyError | E-07 (L18-19) | ○ |
| C-48 | Registry#fetchはブロックでフォールバック | E-07 (L15-17) | ○ |

### Analyzer関連（UT-AST-056〜068）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-49 | Analyzer.accept?はfalseを返す | E-08 (L13-15) | ○ |
| C-50 | Analyzer.analyze_later?はtrueを返す | E-08 (L19-21) | ○ |
| C-51 | Analyzer#metadataはNotImplementedError | E-08 (L27-30) | ○ |
| C-52 | VideoAnalyzer.accept?はblob.video?で判定 | E-09 (L25-27) | ○ |
| C-53 | VideoAnalyzer#metadataはwidth/height/duration等返却 | E-09 (L29-31) | ○ |
| C-54 | VideoAnalyzer#metadataは回転補正 | E-09 (L34-48, L78-80) | ○ |
| C-55 | VideoAnalyzer#metadataはffprobeなしで空Hash | E-09 (L148-151) | ○ |
| C-56 | ImageAnalyzer.accept?はblob.image?で判定 | E-10 (L20-22) | ○ |
| C-57 | ImageAnalyzer#metadataはwidth/height返却 | E-10 (L24-32) | ○ |
| C-58 | AudioAnalyzer.accept?はblob.audio?で判定 | E-11 (L15-17) | ○ |
| C-59 | AudioAnalyzer#metadataはduration/bit_rate等返却 | E-11 (L19-21) | ○ |

### Previewer関連（UT-AST-069〜078）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-60 | Previewer.accept?はfalseを返す | E-12 (L14-16) | ○ |
| C-61 | Previewer#previewはNotImplementedError | E-12 (L25-27) | ○ |
| C-62 | VideoPreviewer.accept?はvideo?とffmpeg存在確認 | E-13 (L8-16) | ○ |
| C-63 | VideoPreviewer#previewはJPEG生成 | E-13 (L23-29) | ○ |
| C-64 | MuPDFPreviewer.accept?はPDFとmutool存在確認 | E-14 (L6-24) | ○ |
| C-65 | MuPDFPreviewer#previewはPNG生成 | E-14 (L27-33) | ○ |
| C-66 | PopplerPDFPreviewer.accept?はPDFとpdftoppm存在確認 | E-15 (L6-21) | ○ |
| C-67 | PopplerPDFPreviewer#previewはPNG生成 | E-15 (L25-31) | ○ |

### Attached関連（UT-AST-079〜102）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-68 | Attached#initializeはname/record設定 | E-16 (L10-13) | ○ |
| C-69 | Attached::One#attachmentはchange優先で返却 | E-17 (L33-35) | ○ |
| C-70 | Attached::One#attachはrecordに設定し保存 | E-17 (L58-64) | ○ |
| C-71 | Attached::One#attached?はattachment.present? | E-17 (L73-75) | ○ |
| C-72 | Attached::One#blank?はattached?の否定 | E-17 (L44-46) | ○ |
| C-73 | Attached::One#purgeはPurgeOneに委譲 | E-17 (L13, L78-79) | ○ |
| C-74 | Attached::One#purge_laterはPurgeOneに委譲 | E-17 (L19, L78-79) | ○ |
| C-75 | Attached::One#detachはDetachOneに委譲 | E-17 (L25, L82-83) | ○ |
| C-76 | Attached::Many#attachmentsはchange優先で返却 | E-18 (L32-34) | ○ |
| C-77 | Attached::Many#blobsはchange優先で返却 | E-18 (L37-39) | ○ |
| C-78 | Attached::Many#attachは既存に追加 | E-18 (L51-57) | ○ |
| C-79 | Attached::Many#attached?はattachments.any? | E-18 (L66-68) | ○ |
| C-80 | Attached::Model.has_one_attachedはメソッド定義 | E-19 (L121-170) | ○ |
| C-81 | Attached::Model.has_one_attachedはservice検証 | E-19 (L122, L288-296) | ○ |
| C-82 | Attached::Model.has_many_attachedはメソッド定義 | E-19 (L233-284) | ○ |
| C-83 | Attached::Model#attachment_changesは変更追跡 | E-19 (L306-308) | ○ |
| C-84 | Attached::Model#reloadは変更クリア | E-19 (L320-322) | ○ |

### Attached::Changes関連（UT-AST-103〜113）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-85 | CreateOne#initializeはblob識別実行 | E-21 (L10-13) | ○ |
| C-86 | CreateOne#blobはattachable種別で分岐 | E-21 (L62-112) | ○ |
| C-87 | CreateOne#blobは無効attachableでArgumentError | E-21 (L106-110) | ○ |
| C-88 | CreateOne#uploadはio取得しアップロード | E-21 (L27-31) | ○ |
| C-89 | CreateOne#saveはrecordにattachment設定 | E-21 (L33-36) | ○ |
| C-90 | CreateMany#attachmentsはsubchanges収集 | E-22 (L14-16) | ○ |
| C-91 | CreateMany#blobsはsubchanges収集 | E-22 (L18-20) | ○ |
| C-92 | CreateMany#uploadはpending_uploadsのみ | E-22 (L26-28) | ○ |

### FixtureSet関連（UT-AST-114〜115）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-93 | FixtureSet.blobはYAML属性生成 | E-23 (L66-68) | ○ |
| C-94 | FixtureSet#prepareはアップロード実行 | E-23 (L70-77) | ○ |

### Transformer関連（UT-AST-116〜119）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-95 | Transformer#transformは変換後yield | E-24 (L23-31) | ○ |
| C-96 | Transformer#transformはtempfile自動削除 | E-24 (L28-29) | ○ |
| C-97 | ImageProcessingTransformer#processはImageProcessing使用 | E-25 (L19-26) | ○ |
| C-98 | ImageProcessingTransformer#operationsはcombine_options禁止 | E-25 (L39-44) | ○ |

### Blob関連（UT-AST-120〜148）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-99 | Blob.find_signedは署名ID検索 | E-29 (L75-77) | ○ |
| C-100 | Blob.find_signed!は無効署名でInvalidSignature | E-29 (L79-84) | ○ |
| C-101 | Blob.create_and_upload!は作成とアップロード | E-29 (L101-105) | ○ |
| C-102 | Blob.create_before_direct_upload!はアップロード前作成 | E-29 (L112-114) | ○ |
| C-103 | Blob.composeは複数blob結合 | E-29 (L149-159) | ○ |
| C-104 | Blob.composeは未保存blobでRecordNotSaved | E-29 (L151) | ○ |
| C-105 | Blob#keyは自動生成secure token | E-29 (L176-179) | ○ |
| C-106 | Blob#filenameはFilenameインスタンス返却 | E-29 (L184-186) | ○ |
| C-107 | Blob#image?/video?/audio?/text?はcontent_type判定 | E-29 (L197-214) | ○ |
| C-108 | Blob#urlはservice.url呼び出し | E-29 (L220-223) | ○ |
| C-109 | Blob#service_url_for_direct_uploadは署名付きURL | E-29 (L227-229) | ○ |
| C-110 | Blob#uploadはunfurl+upload_without_unfurling | E-29 (L249-252) | ○ |
| C-111 | Blob#downloadはservice.download呼び出し | E-29 (L272-274) | ○ |
| C-112 | Blob#download_chunkはservice.download_chunk呼び出し | E-29 (L277-279) | ○ |
| C-113 | Blob#openはtempfile yield | E-29 (L293-306) | ○ |
| C-114 | Blob#openはlocal_ioでダウンロードスキップ | E-29 (L294-296) | ○ |
| C-115 | Blob#deleteはservice.delete呼び出し | E-29 (L315-318) | ○ |
| C-116 | Blob#deleteは画像でvariants削除 | E-29 (L317) | ○ |
| C-117 | Blob#purgeはdestroy+delete | E-29 (L323-327) | ○ |
| C-118 | Blob#purge_laterはPurgeJob追加 | E-29 (L331-333) | ○ |
| C-119 | Blob#serviceはservices.fetch | E-29 (L337-338) | ○ |
| C-120 | Blob#custom_metadataはmetadata[:custom]返却 | E-29 (L188-194) | ○ |

### Attachment関連（UT-AST-149〜156）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-121 | Attachment#purgeはdelete+touch+blob.purge | E-30 (L90-96) | ○ |
| C-122 | Attachment#purge_laterはdelete+touch+blob.purge_later | E-30 (L99-105) | ○ |
| C-123 | Attachment#uploadedはvariant処理+アップロード+コールバック | E-30 (L71-87) | ○ |
| C-124 | Attachment#variantはblob.variant呼び出し | E-30 (L121-124) | ○ |
| C-125 | Attachment#variantはシンボルで名前付き解決 | E-30 (L237-248) | ○ |
| C-126 | Attachment#variantは未定義でArgumentError | E-30 (L241-243) | ○ |
| C-127 | Attachment#previewはblob.preview呼び出し | E-30 (L140-143) | ○ |
| C-128 | Attachment#representationはblob.representation呼び出し | E-30 (L159-162) | ○ |

### Variant関連（UT-AST-157〜167）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-129 | Variant#initializeはblob/variation設定 | E-31 (L62-64) | ○ |
| C-130 | Variant#processedは未処理で変換実行 | E-31 (L67-70) | ○ |
| C-131 | Variant#processedは処理済みでスキップ | E-31 (L68) | ○ |
| C-132 | Variant#keyはvariantsプレフィックス+SHA256 | E-31 (L73-75) | ○ |
| C-133 | Variant#urlはservice.url呼び出し | E-31 (L82-84) | ○ |
| C-134 | Variant#downloadはservice.download呼び出し | E-31 (L88-90) | ○ |
| C-135 | Variant#filenameは変換後拡張子 | E-31 (L92-94) | ○ |
| C-136 | Variant#processed?はservice.exist? | E-31 (L107-109) | ○ |
| C-137 | Variant#destroyはservice.delete | E-31 (L102-104) | ○ |
| C-138 | Variant#process_from_ioはローカルIO変換 | E-31 (L114-120) | ○ |

### Variation関連（UT-AST-168〜179）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-139 | Variation.wrapはVariationそのまま返却 | E-32 (L24-26) | ○ |
| C-140 | Variation.wrapは文字列でデコード | E-32 (L27-28) | ○ |
| C-141 | Variation.wrapはHashで新規作成 | E-32 (L29-31) | ○ |
| C-142 | Variation.decodeは署名検証+復元 | E-32 (L35-37) | ○ |
| C-143 | Variation.encodeは署名付きキー生成 | E-32 (L41-43) | ○ |
| C-144 | Variation#transformはファイル変換 | E-32 (L56-60) | ○ |
| C-145 | Variation#formatはデフォルト:png | E-32 (L62-68) | ○ |
| C-146 | Variation#formatは無効でArgumentError | E-32 (L64-66) | ○ |
| C-147 | Variation#content_typeはMIME返却 | E-32 (L70-72) | ○ |
| C-148 | Variation#keyは署名付きキー | E-32 (L75-77) | ○ |
| C-149 | Variation#default_toはマージ済み新規返却 | E-32 (L50-52) | ○ |

### Filename関連（UT-AST-180〜192）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-150 | Filename.wrapはFilenameそのまま返却 | E-33 (L13-15) | ○ |
| C-151 | Filename.wrapは文字列で新規作成 | E-33 (L13-15) | ○ |
| C-152 | Filename#baseは拡張子除外 | E-33 (L27-29) | ○ |
| C-153 | Filename#extension_with_delimiterはドット付き | E-33 (L37-39) | ○ |
| C-154 | Filename#extension_without_delimiterはドットなし | E-33 (L47-49) | ○ |
| C-155 | Filename#sanitizedは危険文字置換 | E-33 (L59-61) | ○ |
| C-156 | Filename#sanitizedはパス区切り置換 | E-33 (L60) | ○ |
| C-157 | Filename#sanitizedはRTL文字置換 | E-33 (L60) | ○ |
| C-158 | Filename#to_sはsanitized返却 | E-33 (L64-66) | ○ |
| C-159 | Filename#<=>は大文字小文字無視比較 | E-33 (L73-75) | ○ |

### Preview関連（UT-AST-193〜204）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-160 | Preview#initializeはblob/variation設定 | E-34 (L42-44) | ○ |
| C-161 | Preview#processedは未処理でプレビュー生成 | E-34 (L52-56) | ○ |
| C-162 | Preview#processedはvariation時にvariant処理 | E-34 (L54) | ○ |
| C-163 | Preview#imageはblob.preview_image返却 | E-34 (L59-61) | ○ |
| C-164 | Preview#urlは処理済みでURL返却 | E-34 (L68-74) | ○ |
| C-165 | Preview#urlは未処理でUnprocessedError | E-34 (L72-73) | ○ |
| C-166 | Preview#keyは処理済みでキー返却 | E-34 (L77-83) | ○ |
| C-167 | Preview#keyは未処理でUnprocessedError | E-34 (L81-82) | ○ |
| C-168 | Preview#downloadは処理済みでダウンロード | E-34 (L90-96) | ○ |
| C-169 | Preview#downloadは未処理でUnprocessedError | E-34 (L94-95) | ○ |
| C-170 | Preview#processed?はimage.attached? | E-34 (L98-100) | ○ |

### Reflection関連（UT-AST-205〜210）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-171 | HasAttachedReflection#variantは名前付き定義 | E-26 (L6-8) | ○ |
| C-172 | HasAttachedReflection#named_variantsは定義済み返却 | E-26 (L10-12) | ○ |
| C-173 | HasOneAttachedReflection#macroは:has_one_attached | E-26 (L18-20) | ○ |
| C-174 | HasManyAttachedReflection#macroは:has_many_attached | E-26 (L26-28) | ○ |
| C-175 | reflect_on_all_attachmentsは全reflection返却 | E-26 (L59-61) | ○ |
| C-176 | reflect_on_attachmentは指定reflection返却 | E-26 (L67-70) | ○ |

### Error関連（UT-AST-211〜216）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-177 | IntegrityErrorはError継承 | E-28 (L21) | ○ |
| C-178 | FileNotFoundErrorはError継承 | E-28 (L25) | ○ |
| C-179 | InvariableErrorはError継承 | E-28 (L9) | ○ |
| C-180 | UnpreviewableErrorはError継承 | E-28 (L13) | ○ |
| C-181 | UnrepresentableErrorはError継承 | E-28 (L17) | ○ |
| C-182 | PreviewErrorはError継承 | E-28 (L28) | ○ |

### LogSubscriber関連（UT-AST-217〜220）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-183 | LogSubscriber#service_uploadはアップロードログ | E-27 (L9-14) | ○ |
| C-184 | LogSubscriber#service_downloadはダウンロードログ | E-27 (L16-19) | ○ |
| C-185 | LogSubscriber#service_deleteは削除ログ | E-27 (L31-34) | ○ |
| C-186 | LogSubscriber#service_existは存在確認ログ | E-27 (L41-44) | ○ |

## 4) 不足情報（Unknown / Missing）
- **ffprobe/ffmpegの出力形式**：VideoAnalyzer, AudioAnalyzerのテストケースはffprobeの出力に依存するが、ffprobeのバージョンによる出力形式の違いは検証していない
  - 候補：ffprobe --version / 公式ドキュメント / 既存テストケース
- **外部サービス（S3/GCS）の実際の挙動**：S3Service, GCSServiceのテストケースはAWS SDK/Google Cloud SDKの挙動に依存するが、実際のAPIレスポンスは検証していない
  - 候補：AWS SDK ドキュメント / Google Cloud SDK ドキュメント / 既存統合テスト

## 5) リスクフラグ（レビュー観点）
- **0 (低リスク)**: Filename, Variation, Reflection関連のテストケース - 純粋なRubyロジックで外部依存なし
- **0 (低リスク)**: LogSubscriber関連のテストケース - ログ出力の確認のみ
- **1 (中リスク)**: DiskService関連のテストケース - ファイルシステム操作に依存
- **1 (中リスク)**: Analyzer/Previewer関連のテストケース - 外部コマンド（ffprobe, ffmpeg, mutool, pdftoppm）に依存
- **1 (中リスク)**: Blob/Attachment/Variant関連のテストケース - ActiveRecordとServiceの統合に依存
- **2 (高リスク)**: S3Service/GCSService関連のテストケース - 外部クラウドサービスに依存、モック/スタブが必要

## 6) レビュアーチェックリスト（最小）
- [ ] 全テストケースがCSVフォーマットに準拠しているか確認
- [ ] テストIDの命名規則（UT-AST-XXX）が連番になっているか確認
- [ ] 正常系/異常系/境界値の各観点が主要クラスに対して網羅されているか確認
- [ ] 外部依存（ffprobe, ffmpeg, AWS SDK, Google Cloud SDK）を持つテストケースにモック/スタブの使用が明記されているか確認
- [ ] セキュリティ関連（Filename#sanitized, 署名ID検証）のテストケースが適切にカバーされているか確認
- [ ] 高優先度のテストケース（IntegrityError, FileNotFoundError関連）が漏れなくカバーされているか確認
