---
generated_at: 2026-02-19 12:00:00
metrics:
  claims_total: 160
  claims_with_evidence: 156
  claims_without_evidence: 4
confidence_derived: 0.975
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.975**
  - 根拠あり：156 / 160、根拠なし：4
- 優先レビュー（高）
  1. **UT-UTL-143〜145（Activity関連）**：ランタイム依存のため実行環境での検証が必要
  2. **UT-UTL-154（Graph.IterateCycles）**：循環検出アルゴリズムの詳細仕様確認
  3. **UT-UTL-112（ByteBuffer.Dispose）**：ArrayPool使用時の挙動確認
  4. **UT-UTL-079（LruCache弱参照化）**：GC依存の挙動

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

- E-01: `src/Compiler/Utilities/illib.fs` - InterruptibleLazy, Array, List, String, UniqueStampGenerator, MemoizationTable, LazyWithContext, NameMap, NameMultiMap, ResultOrException等の実装
- E-02: `src/Compiler/Utilities/lib.fs` - Bits, ListAssoc, ListSet, Graph, cached, DisposablesTracker, ArrayParallel, WeakMap等の実装
- E-03: `src/Compiler/Utilities/range.fs` - Position, Range, FileIndexTable, Range.module等の実装
- E-04: `src/Compiler/Utilities/EditDistance.fs` - jaro, JaroWinklerDistance, CalculateEditDistance等の実装
- E-05: `src/Compiler/Utilities/Cancellable.fs` - Cancellable, CancellableBuilder, Cancellable.module等の実装
- E-06: `src/Compiler/Utilities/LruCache.fs` - LruCache, ValueLink等の実装
- E-07: `src/Compiler/Utilities/zmap.fs` - Zmap module関数群の実装
- E-08: `src/Compiler/Utilities/zset.fs` - Zset module関数群の実装
- E-09: `src/Compiler/Utilities/PathMap.fs` - PathMap, addMapping, apply, applyDir等の実装
- E-10: `src/Compiler/Utilities/HashMultiMap.fs` - HashMultiMap class実装
- E-11: `src/Compiler/Utilities/FileSystem.fs` - ByteMemory, ByteArrayMemory, ByteBuffer, FileSystemUtils, DefaultFileSystem等の実装
- E-12: `src/Compiler/Utilities/ResizeArray.fs` - ResizeArray module関数群の実装
- E-13: `src/Compiler/Utilities/rational.fs` - Rational type, mkRational, 算術演算関数群の実装
- E-14: `src/Compiler/Utilities/QueueList.fs` - QueueList class, module関数群の実装
- E-15: `src/Compiler/Utilities/Activity.fs` - Activity, Metrics, Activity.Profiling等の実装

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

### InterruptibleLazy（illib.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | InterruptibleLazy.Valueが遅延評価を実行 | E-01 lines 17-49 | ○ |
| C-02 | 評価済みの場合は再計算しない | E-01 lines 29-31, 36 | ○ |
| C-03 | 評価中の例外が伝播する | E-01 lines 40-48 | ○ |
| C-04 | FromValueで即時評価済みLazyを作成 | E-01 lines 53-54 | ○ |

### Array（illib.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-05 | mapqが物理等価性を考慮したmap | E-01 lines 223-238 | ○ |
| C-06 | 空配列の場合は同じ配列を返す | E-01 lines 224-225 | ○ |
| C-07 | 要素が変化しない場合は元の配列を返す | E-01 lines 232-238 | ○ |
| C-08 | areEqualで配列等価性チェック | E-01 lines 340-356 | ○ |
| C-09 | 両方空配列でtrue | E-01 line 342 | ○ |
| C-10 | 長さが異なる配列はfalse | E-01 line 343 | ○ |
| C-11 | isSubArrayで部分配列検出 | E-01 lines 370-386 | ○ |
| C-12 | 空の部分配列は常にtrue | E-01 lines 371-372 | ○ |
| C-13 | startsWithでプレフィックスチェック | E-01 line 389 | ○ |
| C-14 | endsWithでサフィックスチェック | E-01 lines 392-393 | ○ |
| C-15 | revInPlaceでインプレース反転 | E-01 lines 302-312 | ○ |
| C-16 | 空配列の反転は何も起きない | E-01 lines 303-304 | ○ |
| C-17 | replaceで要素置換 | E-01 lines 329-335 | ○ |
| C-18 | 範囲外インデックスで例外 | E-01 lines 330-331 | ○ |
| C-19 | headsで全先頭部分配列生成 | E-01 lines 360-366 | ○ |

### List（illib.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-20 | splitAfterでリスト分割 | E-01 lines 424-431 | ○ |
| C-21 | frontAndBackでリスト分解 | E-01 lines 491-500 | ○ |
| C-22 | 空リストで例外 | E-01 lines 493-496 | ○ |
| C-23 | tryRemoveで条件付き削除 | E-01 lines 507-513 | ○ |
| C-24 | 条件不一致でNone | E-01 lines 508-510 | ○ |
| C-25 | zip4で4要素zip | E-01 lines 515-517 | ○ |
| C-26 | duplicatesで重複検出 | E-01 lines 626-630 | ○ |

### String（illib.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-27 | isLeadingIdentifierCharacterUpperCase大文字判定 | E-01 lines 740-751 | ○ |
| C-28 | 小文字開始でfalse | E-01 lines 744-749 | ○ |
| C-29 | capitalizeで先頭大文字化 | E-01 lines 753-757 | ○ |
| C-30 | 空文字列は空文字列を返す | E-01 lines 754-755 | ○ |
| C-31 | uncapitalizeで先頭小文字化 | E-01 lines 759-763 | ○ |
| C-32 | extractTrailingIndexで末尾数字抽出 | E-01 lines 783-792 | ○ |
| C-33 | 数字なしでNone | E-01 line 791 | ○ |
| C-34 | getLinesで行分割 | E-01 lines 808-822 | ○ |

### UniqueStampGenerator, MemoizationTable, LazyWithContext（illib.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-35 | 同じ値に同じスタンプ | E-01 lines 943-951 | ○ |
| C-36 | 異なる値に異なるスタンプ | E-01 lines 946-950 | ○ |
| C-37 | MemoizationTableの計算結果キャッシュ | E-01 lines 955-969 | ○ |
| C-38 | LazyWithContext.Forceでコンテキスト付き遅延評価 | E-01 lines 1045-1060 | ○ |
| C-39 | 評価済みで再計算しない | E-01 lines 1046-1052 | ○ |
| C-40 | 例外発生時は例外情報保持 | E-01 lines 1081-1083 | ○ |

### NameMap, NameMultiMap, ResultOrException（illib.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-41 | NameMap.layerでマップ合成 | E-01 line 1177 | ○ |
| C-42 | NameMultiMap.addで複数値追加 | E-01 line 1264 | ○ |
| C-43 | NameMultiMap.findで空リスト返却 | E-01 lines 1259-1262 | ○ |
| C-44 | ResultOrException.ForceRaiseで結果取り出し | E-01 lines 932-935 | ○ |
| C-45 | Exception値で例外再スロー | E-01 line 935 | ○ |

### Position, Range（range.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | Position constructorで位置情報作成 | E-03 lines 35-45 | ○ |
| C-47 | 負の値は0に正規化 | E-03 lines 38-39 | ○ |
| C-48 | Position.IsAdjacentToで隣接判定 | E-03 lines 66-67 | ○ |
| C-49 | 異なる行は隣接しない | E-03 line 67 | ○ |
| C-50 | Range constructorで範囲情報作成 | E-03 lines 282-296 | ○ |
| C-51 | Range.Equalsで等価性判定 | E-03 lines 423-426 | ○ |
| C-52 | MakeSyntheticで合成フラグ設定 | E-03 lines 359-360 | ○ |
| C-53 | unionRangesで範囲統合 | E-03 lines 520-555 | ○ |
| C-54 | 異なるファイルで後者を返す | E-03 lines 521-522 | ○ |
| C-55 | rangeContainsRangeで範囲包含判定 | E-03 lines 571-572 | ○ |
| C-56 | rangeContainsPosで位置包含判定 | E-03 line 574 | ○ |

### FileIndexTable（range.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | FileToIndexでインデックス取得 | E-03 lines 196-234 | ○ |
| C-58 | 同じパスには同じインデックス | E-03 lines 197-198 | ○ |
| C-59 | IndexToFileでパス逆引き | E-03 lines 236-243 | ○ |
| C-60 | 無効インデックスで例外 | E-03 lines 237-241 | ○ |

### EditDistance（EditDistance.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-61 | JaroWinklerDistanceで類似度計算 | E-04 lines 87-101 | ○ |
| C-62 | 同一文字列で1.0 | E-04 lines 88-98 | ○ |
| C-63 | 異なる文字列で低い値 | E-04 lines 23-83 | ○ |
| C-64 | CalculateEditDistanceで編集距離計算 | E-04 lines 139-143 | ○ |
| C-65 | 同一文字列で0 | E-04 lines 107-134 | ○ |
| C-66 | 空文字列との距離 | E-04 lines 108-109 | ○ |

### Cancellable（Cancellable.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-67 | CheckAndThrowでキャンセル未要求時何も起きない | E-05 lines 45-47 | ○ |
| C-68 | キャンセル要求時に例外 | E-05 line 47 | ○ |
| C-69 | UsingTokenでトークン設定 | E-05 lines 37-43 | ○ |
| C-70 | Dispose後にトークン復元 | E-05 line 42 | ○ |
| C-71 | runで計算実行 | E-05 lines 72-80 | ○ |
| C-72 | キャンセル時にCancelled | E-05 lines 73-74 | ○ |
| C-73 | toAsyncでAsync変換 | E-05 lines 101-112 | ○ |
| C-74 | CancellableBuilder.Bindでバインド | E-05 lines 123-130 | ○ |
| C-75 | TryWithで例外処理 | E-05 lines 150-168 | ○ |

### LruCache（LruCache.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-76 | Setでキャッシュ設定 | E-06 lines 118-166 | ○ |
| C-77 | TryGetで値取得 | E-06 lines 171-202 | ○ |
| C-78 | 存在しないキーでNone | E-06 lines 173-174 | ○ |
| C-79 | keepStrongly超過時に弱参照化 | E-06 lines 82-104 | △ |
| C-80 | Removeで削除 | E-06 lines 228-242 | ○ |
| C-81 | Clearで全削除 | E-06 lines 253-256 | ○ |
| C-82 | GetAllで全バージョン取得 | E-06 lines 212-226 | ○ |

### Zmap, Zset（zmap.fs, zset.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-83 | Zmap.addで追加 | E-07 line 15 | ○ |
| C-84 | Zmap.tryFindで検索成功 | E-07 line 17 | ○ |
| C-85 | Zmap.tryFindで検索失敗 | E-07 line 17 | ○ |
| C-86 | Zmap.removeで削除 | E-07 line 18 | ○ |
| C-87 | Zmap.memで存在確認 | E-07 line 19 | ○ |
| C-88 | Zset.addで追加 | E-08 line 20 | ○ |
| C-89 | Zset.containsで存在確認 | E-08 line 18 | ○ |
| C-90 | Zset.removeで削除 | E-08 line 26 | ○ |
| C-91 | Zset.unionで和集合 | E-08 lines 47-48 | ○ |
| C-92 | Zset.interで積集合 | E-08 lines 50-51 | ○ |
| C-93 | Zset.diffで差集合 | E-08 lines 53-54 | ○ |

### PathMap（PathMap.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-94 | addMappingでマッピング追加 | E-09 lines 20-31 | ○ |
| C-95 | applyでパス変換 | E-09 lines 35-60 | ○ |
| C-96 | マッピングなしで元パス返却 | E-09 line 60 | ○ |
| C-97 | applyDirでディレクトリ変換 | E-09 lines 62-67 | ○ |

### HashMultiMap（HashMultiMap.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-98 | Addで追加 | E-10 lines 39-44 | ○ |
| C-99 | 同じキーに複数値追加 | E-10 lines 40-41 | ○ |
| C-100 | FindAllで全値取得 | E-10 lines 72-75 | ○ |
| C-101 | 存在しないキーで空リスト | E-10 line 75 | ○ |
| C-102 | Removeで削除 | E-10 lines 105-121 | ○ |
| C-103 | Copyでディープコピー | E-10 lines 54-63 | ○ |

### ByteMemory, ByteBuffer, FileSystem（FileSystem.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-104 | ByteArrayMemory.ReadBytesで部分読み取り | E-11 lines 90-96 | ○ |
| C-105 | 負のcountで例外 | E-11 lines 71-73 | ○ |
| C-106 | ReadInt32でリトルエンディアン読み取り | E-11 lines 98-105 | ○ |
| C-107 | Sliceでスライス作成 | E-11 lines 119-125 | ○ |
| C-108 | count=0で空ByteMemory | E-11 lines 124-125 | ○ |
| C-109 | ByteBuffer.EmitByteでバイト書き込み | E-11 lines 973-975 | ○ |
| C-110 | EmitInt32でリトルエンディアン書き込み | E-11 lines 997-1002 | ○ |
| C-111 | Ensureで自動拡張 | E-11 lines 945-960 | ○ |
| C-112 | DisposeでArrayPool返却 | E-11 lines 1067-1074 | △ |
| C-113 | checkPathForIllegalCharsでパス検証 | E-11 lines 400-406 | ○ |
| C-114 | 不正文字で例外 | E-11 lines 405-406 | ○ |
| C-115 | hasExtensionで拡張子あり | E-11 lines 410-417 | ○ |
| C-116 | hasExtensionで拡張子なし | E-11 line 417 | ○ |
| C-117 | chopExtensionで拡張子削除 | E-11 lines 421-430 | ○ |
| C-118 | GetFullPathShimで絶対パス取得 | E-11 line 579 | ○ |
| C-119 | IsInvalidPathShimで有効パスfalse | E-11 lines 617-644 | ○ |
| C-120 | IsInvalidPathShimで無効パスtrue | E-11 lines 618-620 | ○ |

### ResizeArray（ResizeArray.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-121 | blitで配列間コピー | E-12 lines 22-39 | ○ |
| C-122 | 負のstart1で例外 | E-12 lines 23-24 | ○ |
| C-123 | subで部分取得 | E-12 lines 52-62 | ○ |
| C-124 | findで要素検索 | E-12 lines 143-149 | ○ |
| C-125 | findで検索失敗時例外 | E-12 lines 140-141, 145 | ○ |
| C-126 | partitionで分割 | E-12 lines 215-223 | ○ |
| C-127 | zipでペア結合 | E-12 lines 431-437 | ○ |
| C-128 | 長さ不一致で例外 | E-12 lines 433-435 | ○ |

### Rational（rational.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-129 | mkRationalで有理数作成 | E-13 lines 19-31 | ○ |
| C-130 | 約分される | E-13 lines 24-25 | ○ |
| C-131 | 分母0で例外 | E-13 lines 21-22 | ○ |
| C-132 | AddRationalで加算 | E-13 lines 39-43 | ○ |
| C-133 | MulRationalで乗算 | E-13 lines 47-48 | ○ |
| C-134 | DivRationalで除算 | E-13 lines 50-51 | ○ |
| C-135 | NegRationalで符号反転 | E-13 line 45 | ○ |
| C-136 | SignRationalで正の判定 | E-13 line 70 | ○ |
| C-137 | SignRationalで負の判定 | E-13 line 69 | ○ |
| C-138 | SignRationalでゼロ判定 | E-13 line 71 | ○ |

### QueueList（QueueList.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-139 | AppendOneでO(1)追加 | E-14 lines 49-50 | ○ |
| C-140 | ToListでリスト変換 | E-14 lines 38-42 | ○ |
| C-141 | Appendでシーケンス追加 | E-14 lines 52-56 | ○ |
| C-142 | foldBackで右畳み込み | E-14 lines 80-81 | ○ |

### Activity（Activity.fs）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-143 | startでアクティビティ開始 | E-15 lines 140-150 | △ |
| C-144 | addEventでイベント追加 | E-15 lines 153-160 | △ |
| C-145 | formatTableでテーブル整形 | E-15 lines 24-61 | ○ |

### lib.fs関数群
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-146 | Bits.b0で最下位バイト取得 | E-02 line 38 | ○ |
| C-147 | Bits.b3で最上位バイト取得 | E-02 line 41 | ○ |
| C-148 | ListAssoc.findで関連リスト検索 | E-02 lines 104-107 | ○ |
| C-149 | ListAssoc.findで検索失敗時例外 | E-02 line 106 | ○ |
| C-150 | ListSet.insertで重複なく挿入 | E-02 line 125 | ○ |
| C-151 | 既存要素は追加されない | E-02 line 125 | ○ |
| C-152 | unionFavourRightで統合 | E-02 lines 127-131 | ○ |
| C-153 | subtractで差集合 | E-02 lines 148-151 | ○ |
| C-154 | Graph.IterateCyclesで循環検出 | E-02 lines 319-323 | ○ |
| C-155 | cachedで計算結果キャッシュ | E-02 lines 344-351 | ○ |
| C-156 | DisposablesTracker.Registerでリソース追跡 | E-02 lines 406-409 | ○ |
| C-157 | DisposablesTracker.Disposeで一括解放 | E-02 lines 413-417 | ○ |
| C-158 | ArrayParallel.mapで並列map | E-02 lines 438-444 | ○ |
| C-159 | ArrayParallel.iterで並列iter | E-02 lines 435-436 | ○ |
| C-160 | WeakMap.getOrCreateで弱参照マップ取得 | E-02 lines 471-475 | ○ |

## 4) 不足情報（Unknown / Missing）
- **UT-UTL-079（LruCache弱参照化）**：GC動作に依存するため、実際の弱参照化タイミングは環境依存
  - 候補：GCモック / 手動GC呼び出しによる検証
- **UT-UTL-112（ByteBuffer.Dispose）**：ArrayPool.Shared.Returnの呼び出し確認が必要
  - 候補：ArrayPoolのモック / カスタムArrayPool
- **UT-UTL-143, 144（Activity）**：System.Diagnostics.Activityはランタイム依存
  - 候補：ActivityListenerでの検証 / 統合テスト
- **UT-UTL-154（Graph.IterateCycles）**：循環検出の詳細仕様（複数循環、自己ループ等）
  - 候補：既存テストコードの参照

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**：大部分のテストケース - ソースコードから直接導出可能
- **1（中リスク）**：並列処理関連（ArrayParallel）、GC依存（LruCache弱参照化）
- **2（高リスク）**：Activity関連テスト - ランタイム/環境依存のため実行環境での検証が必須

## 6) レビュアーチェックリスト（最小）
- [ ] 全テストケースが対応するソースコードの関数/メソッドをカバーしているか
- [ ] 境界値テスト（空配列、空文字列、null、0、負数）が網羅されているか
- [ ] 異常系テスト（例外スロー）が適切に設計されているか
- [ ] スレッドセーフな関数（InterruptibleLazy, UniqueStampGenerator等）の並行テストが考慮されているか
- [ ] GC依存の挙動（LruCache, WeakMap）のテスト戦略が適切か
- [ ] Activity関連テストの実行環境要件が明確か
- [ ] 優先度の設定が機能の重要度と一致しているか
