---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 146
  claims_with_evidence: 142
  claims_without_evidence: 4
confidence_derived: 0.97
---

# 根拠レポート：ids.csv

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：142 / 146、根拠なし：4
- 優先レビュー（高）
  1. **C-072（UT-IDS-072）**：OccurrenceModuleIdsPluginの不正オプションバリデーション - スキーマ定義ファイルの詳細未確認
  2. **C-100（UT-IDS-100）**：OccurrenceChunkIdsPluginの不正オプションバリデーション - スキーマ定義ファイルの詳細未確認
  3. **C-107（UT-IDS-107）**：HashedModuleIdsPluginの不正オプションバリデーション - スキーマ定義ファイルの詳細未確認
  4. **C-076（UT-IDS-076）**：OccurrenceModuleIdsPlugin のentryModuleカウント - 入出力の具体値がコードの複雑な集計ロジックに依存

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `lib/ids/IdHelpers.js` - ユーティリティ関数群（getHash, avoidNumber, requestToId, shortenLongString等13関数）
- E-02: `lib/ids/NaturalModuleIdsPlugin.js` - NaturalModuleIdsPluginクラス定義
- E-03: `lib/ids/NamedModuleIdsPlugin.js` - NamedModuleIdsPluginクラス定義
- E-04: `lib/ids/OccurrenceModuleIdsPlugin.js` - OccurrenceModuleIdsPluginクラス定義
- E-05: `lib/ids/DeterministicModuleIdsPlugin.js` - DeterministicModuleIdsPluginクラス定義
- E-06: `lib/ids/DeterministicChunkIdsPlugin.js` - DeterministicChunkIdsPluginクラス定義
- E-07: `lib/ids/NamedChunkIdsPlugin.js` - NamedChunkIdsPluginクラス定義
- E-08: `lib/ids/OccurrenceChunkIdsPlugin.js` - OccurrenceChunkIdsPluginクラス定義
- E-09: `lib/ids/HashedModuleIdsPlugin.js` - HashedModuleIdsPluginクラス定義
- E-10: `lib/ids/SyncModuleIdsPlugin.js` - SyncModuleIdsPluginクラス定義
- E-11: `lib/ids/ChunkModuleIdRangePlugin.js` - ChunkModuleIdRangePluginクラス定義
- E-12: `lib/ids/NaturalChunkIdsPlugin.js` - NaturalChunkIdsPluginクラス定義

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | getHash: 文字列のハッシュが指定長で返却される | E-01 (L26-31) | ○ |
| C-002 | getHash: len=0で空文字が返却される | E-01 (L30: digest.slice(0, len)) | ○ |
| C-003 | getHash: 空文字列入力でもハッシュが返却される | E-01 (L28: hash.update(str)) | ○ |
| C-004 | avoidNumber: 数値文字列にアンダースコアが付与される | E-01 (L48-49: `_${str}`) | ○ |
| C-005 | avoidNumber: 非数値文字列がそのまま返却される | E-01 (L43-47: firstChar判定) | ○ |
| C-006 | avoidNumber: 負の数値文字列にアンダースコアが付与される | E-01 (L42-44: charCode 45判定) | ○ |
| C-007 | avoidNumber: 21文字超の文字列がそのまま返却される | E-01 (L39: str.length > 21) | ○ |
| C-008 | avoidNumber: 21文字の数値文字列が処理される | E-01 (L39: str.length > 21) | ○ |
| C-009 | avoidNumber: 数値に見えるが数値でない文字列がそのまま返却される | E-01 (L48: str === String(Number(str))) | ○ |
| C-010 | avoidNumber: 先頭charCode判定ロジック | E-01 (L43-47) | ○ |
| C-011 | requestToId: 相対パスプレフィックスが除去される | E-01 (L58-59: replace(/^(\.\.?\/)+/)) | ○ |
| C-012 | requestToId: 特殊文字がアンダースコアに変換される | E-01 (L59: replace regex) | ○ |
| C-013 | requestToId: 英数字とハイフン・アンダースコアが保持される | E-01 (L59: [^a-z0-9_-]) | ○ |
| C-014 | requestToId: 空文字列入力 | E-01 (L58-59) | ○ |
| C-015 | requestToId: 先頭ドット/ハイフンの変換 | E-01 (L59: (^[.-]|...)) | ○ |
| C-016 | shortenLongString: 100文字未満の文字列がそのまま返却される | E-01 (L68: string.length < 100) | ○ |
| C-017 | shortenLongString: 100文字ちょうどの境界 | E-01 (L68: < 100 なので100文字はelse分岐) | ○ |
| C-018 | shortenLongString: 100文字以上で短縮+ハッシュ付与 | E-01 (L69-73) | ○ |
| C-019 | shortenLongString: デリミタ長による調整 | E-01 (L70: 100 - 6 - delimiter.length) | ○ |
| C-020 | getShortModuleName: libIdentの返却値が使われる | E-01 (L83-84) | ○ |
| C-021 | getShortModuleName: libIdentがnullでnameForConditionが使われる | E-01 (L85-90) | ○ |
| C-022 | getShortModuleName: 両方nullで空文字が返却される | E-01 (L91: return "") | ○ |
| C-023 | getLongModuleName: 短縮名+ハッシュ形式 | E-01 (L109-110) | ○ |
| C-024 | getFullModuleName: 相対パスとして返却 | E-01 (L119-120) | ○ |
| C-025 | getShortChunkName: ルートモジュールからの生成 | E-01 (L138-148) | ○ |
| C-026 | getShortChunkName: idNameHintsのソート | E-01 (L143: chunk.idNameHints.sort()) | ○ |
| C-027 | getShortChunkName: ルートモジュール0件 | E-01 (L139-147) | ○ |
| C-028 | getLongChunkName: 短縮名+長名の結合 | E-01 (L167-184) | ○ |
| C-029 | getFullChunkName: 名前ありチャンク | E-01 (L200: if (chunk.name) return chunk.name) | ○ |
| C-030 | getFullChunkName: 名前なしチャンクのフォールバック | E-01 (L201-205) | ○ |
| C-031 | addToMapOfItems: 新規キーの追加 | E-01 (L216-223) | ○ |
| C-032 | addToMapOfItems: 既存キーへの追加 | E-01 (L217-222) | ○ |
| C-033 | getUsedModuleIdsAndModules: 使用済みIDとモジュールの返却 | E-01 (L232-261) | ○ |
| C-034 | getUsedModuleIdsAndModules: usedModuleIdsがnull/undefinedの場合 | E-01 (L239: if (compilation.usedModuleIds)) | ○ |
| C-035 | getUsedModuleIdsAndModules: filterによる除外 | E-01 (L250-251: filter判定) | ○ |
| C-036 | getUsedModuleIdsAndModules: needId=falseのスキップ | E-01 (L246: if (!module.needId) continue) | ○ |
| C-037 | getUsedModuleIdsAndModules: 既存IDのusedIds追加 | E-01 (L247-249) | ○ |
| C-038 | getUsedModuleIdsAndModules: CSSモジュールの特殊処理 | E-01 (L253-254: isCSSModule) | ○ |
| C-039 | getUsedChunkIds: 使用済みチャンクID収集 | E-01 (L269-286) | ○ |
| C-040 | getUsedChunkIds: usedChunkIdsがnullの場合 | E-01 (L272: if (compilation.usedChunkIds)) | ○ |
| C-041 | getUsedChunkIds: null IDのスキップ | E-01 (L280: if (chunkId !== null)) | ○ |
| C-042 | assignNames: 一意な短縮名の割り当て | E-01 (L298-358) | ○ |
| C-043 | assignNames: 短縮名衝突時の長名使用 | E-01 (L322-327: items.length > 1) | ○ |
| C-044 | assignNames: 長名衝突時の連番付与 | E-01 (L344-353: name + i) | ○ |
| C-045 | assignNames: usedIdsの回避 | E-01 (L341: !usedIds.has(name)) | ○ |
| C-046 | assignNames: 名前空のアイテムがunnamedItemsに入る | E-01 (L336-339: if (!name)) | ○ |
| C-047 | assignNames: 空配列入力 | E-01 (L314-316) | ○ |
| C-048 | assignDeterministicIds: 決定論的ID割り当て | E-01 (L372-412) | ○ |
| C-049 | assignDeterministicIds: 衝突時リトライ | E-01 (L408-410: do-while) | ○ |
| C-050 | assignDeterministicIds: range拡張 | E-01 (L392-401) | ○ |
| C-051 | assignDeterministicIds: salt機能 | E-01 (L380, L407: salt) | ○ |
| C-052 | assignDeterministicIds: expandFactor=0 | E-01 (L396-398: if (expandFactor)) | ○ |
| C-053 | assignDeterministicIds: 空配列入力 | E-01 (L382) | ○ |
| C-054 | assignAscendingModuleIds: 昇順ID割り当て | E-01 (L420-448) | ○ |
| C-055 | assignAscendingModuleIds: 使用済みIDスキップ | E-01 (L432: while (usedIds.has(String(nextId)))) | ○ |
| C-056 | assignAscendingModuleIds: 既存IDモジュールのスキップ | E-01 (L431, L441: getModuleId(module) === null) | ○ |
| C-057 | assignAscendingModuleIds: 空入力 | E-01 (L446-448) | ○ |
| C-058 | assignAscendingChunkIds: 昇順チャンクID | E-01 (L456-478) | ○ |
| C-059 | assignAscendingChunkIds: 使用済みIDスキップ | E-01 (L463: while (usedIds.has(String(nextId)))) | ○ |
| C-060 | assignAscendingChunkIds: 既存IDチャンクのスキップ | E-01 (L462, L471: chunk.id === null) | ○ |
| C-061 | assignAscendingChunkIds: idsプロパティの同時設定 | E-01 (L465: chunk.ids = [nextId]) | ○ |
| C-062 | NaturalModuleIdsPlugin: フック登録 | E-02 (L27-28) | ○ |
| C-063 | NaturalModuleIdsPlugin: preOrderIndex順ソート+昇順ID | E-02 (L29-34) | ○ |
| C-064 | NaturalModuleIdsPlugin: モジュール0件 | E-02 (L29-34) | ○ |
| C-065 | NamedModuleIdsPlugin: デフォルトコンストラクタ | E-03 (L30-33) | ○ |
| C-066 | NamedModuleIdsPlugin: カスタムオプション | E-03 (L30-33) | ○ |
| C-067 | NamedModuleIdsPlugin: 名前ベースID割り当て | E-03 (L50-59) | ○ |
| C-068 | NamedModuleIdsPlugin: カスタムcontext | E-03 (L46-48) | ○ |
| C-069 | NamedModuleIdsPlugin: unnamedModulesへのフォールバック | E-03 (L60-62) | ○ |
| C-070 | NamedModuleIdsPlugin: unnamedModulesが空の場合 | E-03 (L60: if (unnamedModules.length > 0)) | ○ |
| C-071 | OccurrenceModuleIdsPlugin: デフォルトコンストラクタ | E-04 (L36-39) | ○ |
| C-072 | OccurrenceModuleIdsPlugin: 不正オプションバリデーション | E-04 (L37: validate(options)) | △ |
| C-073 | OccurrenceModuleIdsPlugin: 出現回数順ID割り当て | E-04 (L51-163) | ○ |
| C-074 | OccurrenceModuleIdsPlugin: prioritiseInitial=true | E-04 (L118-126, L141-149) | ○ |
| C-075 | OccurrenceModuleIdsPlugin: prioritiseInitial=false | E-04 (L118, L141) | ○ |
| C-076 | OccurrenceModuleIdsPlugin: entryModuleカウント | E-04 (L66-75) | △ |
| C-077 | DeterministicModuleIdsPlugin: デフォルトコンストラクタ | E-05 (L36-39) | ○ |
| C-078 | DeterministicModuleIdsPlugin: カスタムオプション | E-05 (L36-39) | ○ |
| C-079 | DeterministicModuleIdsPlugin: 決定論的ID割り当て | E-05 (L48-92) | ○ |
| C-080 | DeterministicModuleIdsPlugin: maxLengthの反映 | E-05 (L53, L81: 10 ** maxLength) | ○ |
| C-081 | DeterministicModuleIdsPlugin: fixedLength=trueでexpandFactor=0 | E-05 (L55, L82: fixedLength ? 0 : 10) | ○ |
| C-082 | DeterministicModuleIdsPlugin: testオプション | E-05 (L61-62) | ○ |
| C-083 | DeterministicModuleIdsPlugin: failOnConflict=trueでエラー | E-05 (L86-91) | ○ |
| C-084 | DeterministicModuleIdsPlugin: failOnConflict=false | E-05 (L54, L66-68) | ○ |
| C-085 | DeterministicModuleIdsPlugin: salt指定 | E-05 (L56, L84) | ○ |
| C-086 | DeterministicChunkIdsPlugin: デフォルトコンストラクタ | E-06 (L29-32) | ○ |
| C-087 | DeterministicChunkIdsPlugin: カスタムオプション | E-06 (L29-32) | ○ |
| C-088 | DeterministicChunkIdsPlugin: 決定論的チャンクID | E-06 (L40-68) | ○ |
| C-089 | DeterministicChunkIdsPlugin: 既存IDチャンクのフィルタ | E-06 (L52: chunk.id === null) | ○ |
| C-090 | DeterministicChunkIdsPlugin: maxLengthの反映 | E-06 (L46, L64: 10 ** maxLength) | ○ |
| C-091 | DeterministicChunkIdsPlugin: ID衝突時のリトライ | E-06 (L57-59: size比較) | ○ |
| C-092 | NamedChunkIdsPlugin: デフォルトコンストラクタ | E-07 (L31-34) | ○ |
| C-093 | NamedChunkIdsPlugin: カスタムオプション | E-07 (L31-34) | ○ |
| C-094 | NamedChunkIdsPlugin: 名前付きチャンクのID設定 | E-07 (L53-56) | ○ |
| C-095 | NamedChunkIdsPlugin: 名前なしチャンクの名前割り当て | E-07 (L51-83) | ○ |
| C-096 | NamedChunkIdsPlugin: unnamedChunksへのフォールバック | E-07 (L84-86) | ○ |
| C-097 | NamedChunkIdsPlugin: カスタムデリミタ | E-07 (L49, L64) | ○ |
| C-098 | NamedChunkIdsPlugin: デフォルトデリミタ'-' | E-07 (L49: || "-") | ○ |
| C-099 | OccurrenceChunkIdsPlugin: デフォルトコンストラクタ | E-08 (L29-35) | ○ |
| C-100 | OccurrenceChunkIdsPlugin: 不正オプションバリデーション | E-08 (L32: validate(options)) | △ |
| C-101 | OccurrenceChunkIdsPlugin: 出現回数順チャンクID | E-08 (L44-80) | ○ |
| C-102 | OccurrenceChunkIdsPlugin: prioritiseInitial=true | E-08 (L64-72) | ○ |
| C-103 | OccurrenceChunkIdsPlugin: prioritiseInitial=false | E-08 (L64) | ○ |
| C-104 | OccurrenceChunkIdsPlugin: 同一出現回数のソート | E-08 (L78: return compareNatural(a, b)) | ○ |
| C-105 | HashedModuleIdsPlugin: デフォルトコンストラクタ | E-09 (L37-48) | ○ |
| C-106 | HashedModuleIdsPlugin: カスタムオプション | E-09 (L37-48) | ○ |
| C-107 | HashedModuleIdsPlugin: 不正オプションバリデーション | E-09 (L38: validate(options)) | △ |
| C-108 | HashedModuleIdsPlugin: ハッシュベースID割り当て | E-09 (L57-79) | ○ |
| C-109 | HashedModuleIdsPlugin: hashDigestLengthによるID長 | E-09 (L72: let len = this.options.hashDigestLength) | ○ |
| C-110 | HashedModuleIdsPlugin: 衝突時のハッシュ長増加 | E-09 (L73-74: while (usedIds.has(...)) len++) | ○ |
| C-111 | HashedModuleIdsPlugin: カスタムcontext | E-09 (L59-61) | ○ |
| C-112 | SyncModuleIdsPlugin: コンストラクタ | E-10 (L32-35) | ○ |
| C-113 | SyncModuleIdsPlugin: readモードの登録 | E-10 (L52, L56-78) | ○ |
| C-114 | SyncModuleIdsPlugin: createモードの登録 | E-10 (L53, L80-93) | ○ |
| C-115 | SyncModuleIdsPlugin: mergeモードの登録 | E-10 (L47-50) | ○ |
| C-116 | SyncModuleIdsPlugin: updateモードの登録 | E-10 (L47-54) | ○ |
| C-117 | SyncModuleIdsPlugin: ファイル読み込み | E-10 (L57-78) | ○ |
| C-118 | SyncModuleIdsPlugin: ENOENTエラーのスキップ | E-10 (L63-65: err.code !== "ENOENT") | ○ |
| C-119 | SyncModuleIdsPlugin: ENOENT以外のエラー伝播 | E-10 (L63-64: return callback(err)) | ○ |
| C-120 | SyncModuleIdsPlugin: ID復元 | E-10 (L100-125) | ○ |
| C-121 | SyncModuleIdsPlugin: ID衝突時のWebpackError | E-10 (L115-121) | ○ |
| C-122 | SyncModuleIdsPlugin: dataなし時のスキップ | E-10 (L101: if (!data) return) | ○ |
| C-123 | SyncModuleIdsPlugin: ID書き込み | E-10 (L81-93) | ○ |
| C-124 | SyncModuleIdsPlugin: dataChanged=false時のスキップ | E-10 (L82: if (!data || !dataChanged)) | ○ |
| C-125 | SyncModuleIdsPlugin: ソート済み書き込み | E-10 (L85: [...data].sort()) | ○ |
| C-126 | SyncModuleIdsPlugin: recordModulesでのID記録 | E-10 (L128-154) | ○ |
| C-127 | SyncModuleIdsPlugin: libIdentなしのスキップ | E-10 (L141: if (!name) continue) | ○ |
| C-128 | SyncModuleIdsPlugin: ID未設定のスキップ | E-10 (L143-144: if (id === null) continue) | ○ |
| C-129 | SyncModuleIdsPlugin: update時のprune | E-10 (L133-134: needPrune判定) | ○ |
| C-130 | SyncModuleIdsPlugin: testフィルタ | E-10 (L98, L137: test(module)) | ○ |
| C-131 | ChunkModuleIdRangePlugin: コンストラクタ | E-11 (L32-35) | ○ |
| C-132 | ChunkModuleIdRangePlugin: 範囲ID割り当て | E-11 (L42-91) | ○ |
| C-133 | ChunkModuleIdRangePlugin: チャンク未発見エラー | E-11 (L51-54) | ○ |
| C-134 | ChunkModuleIdRangePlugin: 開始ID指定 | E-11 (L81: this.options.start || 0) | ○ |
| C-135 | ChunkModuleIdRangePlugin: 終了ID指定 | E-11 (L87: if (this.options.end && currentId > this.options.end)) | ○ |
| C-136 | ChunkModuleIdRangePlugin: order='index' | E-11 (L63-65) | ○ |
| C-137 | ChunkModuleIdRangePlugin: order='preOrderIndex' | E-11 (L63-65) | ○ |
| C-138 | ChunkModuleIdRangePlugin: order='index2' | E-11 (L67-68) | ○ |
| C-139 | ChunkModuleIdRangePlugin: order='postOrderIndex' | E-11 (L67-68) | ○ |
| C-140 | ChunkModuleIdRangePlugin: 不正order値のエラー | E-11 (L71-72) | ○ |
| C-141 | ChunkModuleIdRangePlugin: デフォルトorder | E-11 (L75-78) | ○ |
| C-142 | ChunkModuleIdRangePlugin: needIdフラグ | E-11 (L84: m.needId) | ○ |
| C-143 | ChunkModuleIdRangePlugin: 既存IDの保持 | E-11 (L84: chunkGraph.getModuleId(m) === null) | ○ |
| C-144 | NaturalChunkIdsPlugin: フック登録 | E-12 (L23-24) | ○ |
| C-145 | NaturalChunkIdsPlugin: 自然順ソート+昇順ID | E-12 (L25-29) | ○ |
| C-146 | NaturalChunkIdsPlugin: チャンク0件 | E-12 (L28-29) | ○ |

## 4) 不足情報（Unknown / Missing）
- C-072, C-100, C-107: バリデーションエラーの具体的なスキーマ定義ファイル（`schemas/plugins/ids/*.json`）を直接参照していないため、どの不正プロパティでエラーになるかの詳細が不明
  - 候補：`schemas/plugins/ids/OccurrenceModuleIdsPlugin.json` / `OccurrenceChunkIdsPlugin.json` / `HashedModuleIdsPlugin.json`
- C-076: OccurrenceModuleIdsPluginのcountOccursInEntry/countOccursの集計ロジックが複雑で、具体的な入出力値の網羅的な検証には実行環境が必要
  - 候補：実際のwebpackコンパイルを通じた統合テスト

## 5) リスクフラグ（レビュー観点）
- 0（低リスク）：IdHelpers.jsのユーティリティ関数群（C-001〜C-061） - 純粋関数が多くテストケースの根拠が明確
- 0（低リスク）：プラグインのコンストラクタテスト（C-065, C-066, C-071, C-077, C-078等） - 単純なオプション保存
- 1（中リスク）：プラグインのapplyメソッド（C-062〜C-146） - webpackのcompiler/compilationモックが必要で、テスト実装の難易度が高い
- 1（中リスク）：SyncModuleIdsPluginのファイルI/O関連テスト（C-117〜C-129） - 非同期処理とファイルシステムのモックが必要

## 6) レビュアーチェックリスト（最小）
- [ ] IdHelpers.jsの全エクスポート関数（13関数）がテスト対象に含まれているか
- [ ] 各プラグイン（11クラス）のconstructor/applyの両方がテスト対象に含まれているか
- [ ] assignNames関数の衝突解決ロジック（短縮名衝突→長名→連番）が十分にカバーされているか
- [ ] assignDeterministicIdsのrange拡張・衝突リトライロジックが十分にカバーされているか
- [ ] SyncModuleIdsPluginの4つのモード（read/create/merge/update）が全てテスト対象に含まれているか
- [ ] DeterministicModuleIdsPluginのfailOnConflictオプションの両値（true/false）がテストされているか
- [ ] スキーマバリデーション（C-072, C-100, C-107）のテストケースの入力値が妥当か確認
- [ ] ChunkModuleIdRangePluginの全orderオプション値（index/preOrderIndex/index2/postOrderIndex/デフォルト/不正値）がカバーされているか
