---
generated_at: 2026-02-17 12:00:00
metrics:
  claims_total: 234
  claims_with_evidence: 234
  claims_without_evidence: 0
confidence_derived: 1.00
---

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

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

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

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

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

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

---

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

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

- E-01: `script/SDBMHash.lua` - SDBMハッシュアルゴリズム実装（61行）
- E-02: `script/await.lua` - 非同期処理ライブラリ（267行）
- E-03: `script/client.lua` - LSPクライアント管理（668行）
- E-04: `script/doctor.lua` - メモリ診断ツール（625行）
- E-05: `script/file-uri.lua` - ファイルURI変換（118行）
- E-06: `script/files.lua` - ファイル管理モジュール（1029行）
- E-07: `script/filewatch.lua` - ファイル監視（129行）
- E-08: `script/fs-utility.lua` - ファイルシステムユーティリティ（666行）
- E-09: `script/gc.lua` - ガベージコレクションヘルパー（121行）
- E-10: `script/inspect.lua` - テーブル表示（337行）
- E-11: `script/json-beautify.lua` - JSON整形（176行）
- E-12: `script/json-edit.lua` - JSON編集（725行）
- E-13: `script/json.lua` - JSONエンコード/デコード（555行）
- E-14: `script/jsonc.lua` - コメント付きJSONサポート（374行）
- E-15: `script/jsonrpc.lua` - JSON-RPCプロトコル（73行）
- E-16: `script/language.lua` - 多言語対応（144行）
- E-17: `script/lazy-cacher.lua` - 遅延キャッシュ（171行）
- E-18: `script/lazytable.lua` - 遅延テーブル（351行）
- E-19: `script/lclient.lua` - テスト用言語クライアント（268行）
- E-20: `script/library.lua` - ライブラリ管理（672行）
- E-21: `script/linked-table.lua` - 双方向リスト（227行）
- E-22: `script/locale-loader.lua` - ロケールローダー（28行）
- E-23: `script/log.lua` - ログ出力（165行）
- E-24: `script/plugin.lua` - プラグインシステム（176行）
- E-25: `script/progress.lua` - プログレスバー（182行）
- E-26: `script/string-merger.lua` - 文字列差分マージ（148行）
- E-27: `script/text-merger.lua` - テキスト差分マージ（115行）
- E-28: `script/timer.lua` - タイマー管理（244行）
- E-29: `script/tracy.lua` - プロファイリング（32行）
- E-30: `script/utility.lua` - 汎用ユーティリティ（1335行）
- E-31: `script/version.lua` - バージョン情報（30行）
- E-32: `script/without-check-nil.lua` - nilチェック回避（126行）
- E-33: `script/global.d.lua` - グローバル定義（113行）

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

### SDBMHash.lua（C-01〜C-07）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | rawHash: 文字列のハッシュ値計算 | E-01: line 12-18 `function mt:rawHash(str)` | ○ |
| C-02 | rawHash: 空文字列で0返却 | E-01: line 13 `local id = 0` | ○ |
| C-03 | hash: キャッシュなし時の計算・格納 | E-01: line 23-29 `self.cache[id] = str` | ○ |
| C-04 | hash: キャッシュヒット時の取得 | E-01: line 25-26 `if other == nil or str == other` | ○ |
| C-05 | hash: ハッシュ衝突時の別ID割当 | E-01: line 31-40 衝突解決ループ | ○ |
| C-06 | setCache: キャッシュテーブル設定 | E-01: line 44-46 `function mt:setCache(t)` | ○ |
| C-07 | getCache: キャッシュテーブル取得 | E-01: line 48-50 `function mt:getCache()` | ○ |

### await.lua（C-08〜C-28）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-08 | setErrorHandle: エラーハンドラ設定 | E-02: line 28-30 `function m.setErrorHandle(errHandle)` | ○ |
| C-09 | call: コルーチン作成・実行 | E-02: line 42-66 `function m.call(callback, ...)` | ○ |
| C-10 | call: ID設定機能 | E-02: line 49-55 `setID(id, co)` | ○ |
| C-11 | await: タスク待機 | E-02: line 70-80 `function m.await(callback, ...)` | ○ |
| C-12 | await: yield不可時の直接実行 | E-02: line 71-73 `if not coroutine.isyieldable() then return callback(...) end` | ○ |
| C-13 | setID: ID設定 | E-02: line 83-86 `function m.setID(id, callback)` | ○ |
| C-14 | close: タスク終了 | E-02: line 89-104 `function m.close(id)` | ○ |
| C-15 | close: 存在しないID | E-02: line 90-93 `if not map then return end` | ○ |
| C-16 | hasID: ID存在確認true | E-02: line 106-109 `function m.hasID(id, co)` | ○ |
| C-17 | hasID: ID不存在確認false | E-02: line 108 `return m.idMap[id] and m.idMap[id][co] ~= nil` | ○ |
| C-18 | sleep: スリープ機能 | E-02: line 119-134 `function m.sleep(time)` | ○ |
| C-19 | sleep: yield不可時エラー | E-02: line 120-124 `if not coroutine.isyieldable() then` | ○ |
| C-20 | wait: 待機機能 | E-02: line 139-153 `function m.wait(callback, ...)` | ○ |
| C-21 | delay: 遅延キュー追加 | E-02: line 157-177 `function m.delay()` | ○ |
| C-22 | delay: 無効状態 | E-02: line 158-160 `if not m._enable then return end` | ○ |
| C-23 | step: ステップ実行 | E-02: line 229-253 `function m.step()` | ○ |
| C-24 | step: 空キュー | E-02: line 246-251 `return false` | ○ |
| C-25 | enable: 有効化 | E-02: line 259-261 `function m.enable()` | ○ |
| C-26 | disable: 無効化 | E-02: line 263-265 `function m.disable()` | ○ |
| C-27 | throttledDelayer: スロットリング | E-02: line 183-192 `function throttledDelayer:delay()` | ○ |
| C-28 | newThrottledDelayer: デレイヤー作成 | E-02: line 194-199 `function m.newThrottledDelayer(factor)` | ○ |

### client.lua（C-29〜C-44）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-29 | client: クライアント管理 | E-03: line 18-24 `function m.client(newClient)` | ○ |
| C-30 | isVSCode: VSCode判定true | E-03: line 26-40 `function m.isVSCode()` | ○ |
| C-31 | isVSCode: 非VSCode判定false | E-03: line 36-37 `m._isvscode = false` | ○ |
| C-32 | getOption: オプション取得 | E-03: line 42-47 `function m.getOption(name)` | ○ |
| C-33 | getAbility: 能力取得 | E-03: line 49-71 `function m.getAbility(name)` | ○ |
| C-34 | getAbility: 存在しない能力 | E-03: line 61-63 `if not current then return current end` | ○ |
| C-35 | getOffsetEncoding: UTF-8 | E-03: line 73-88 `function m.getOffsetEncoding()` | ○ |
| C-36 | getOffsetEncoding: デフォルトUTF-16 | E-03: line 86-87 `m._offsetEncoding = 'utf-16'` | ○ |
| C-37 | showMessage: メッセージ表示 | E-03: line 102-113 `function m.showMessage(type, ...)` | ○ |
| C-38 | requestMessage: リクエストメッセージ | E-03: line 119-145 `function m.requestMessage(...)` | ○ |
| C-39 | setConfig: 設定変更 | E-03: line 522-572 `function m.setConfig(changes, onlyMemory)` | ○ |
| C-40 | editText: テキスト編集 | E-03: line 578-597 `function m.editText(uri, edits)` | ○ |
| C-41 | event: イベント登録 | E-03: line 626-628 `function m.event(callback)` | ○ |
| C-42 | setReady: 準備完了 | E-03: line 638-641 `function m.setReady()` | ○ |
| C-43 | isReady: 準備状態確認 | E-03: line 643-645 `function m.isReady()` | ○ |
| C-44 | init: 初期化 | E-03: line 656-666 `function m.init(t)` | ○ |

### doctor.lua（C-45〜C-51）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-45 | snapshot: スナップショット取得 | E-04: line 171-471 `m.snapshot = private(function ()` | ○ |
| C-46 | catch: 参照追跡 | E-04: line 478-528 `m.catch = private(function (...)` | ○ |
| C-47 | report: レポート生成 | E-04: line 535-573 `m.report = private(function ()` | ○ |
| C-48 | exclude: 除外設定 | E-04: line 577-579 `m.exclude = private(function (...)` | ○ |
| C-49 | compare: レポート比較 | E-04: line 583-598 `m.compare = private(function (old, new)` | ○ |
| C-50 | enableCache: キャッシュ有効化 | E-04: line 609-616 `m.enableCache = private(function (flag)` | ○ |
| C-51 | flushCache: キャッシュクリア | E-04: line 619-621 `m.flushCache = private(function ()` | ○ |

### file-uri.lua（C-52〜C-61）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-52 | encode: Unixパス変換 | E-05: line 26-59 `function m.encode(path)` | ○ |
| C-53 | encode: Windowsパス変換 | E-05: line 28-30 `if platform.os == 'windows' then` | ○ |
| C-54 | encode: UNCパス変換 | E-05: line 32-44 UNCパス処理 | ○ |
| C-55 | decode: URIからパス変換 | E-05: line 69-89 `function m.decode(uri)` | ○ |
| C-56 | decode: WindowsURI変換 | E-05: line 85-87 `if platform.os == 'windows' then` | ○ |
| C-57 | decode: 無効URI | E-05: line 71-73 `if not scheme then return '' end` | ○ |
| C-58 | split: URI分割 | E-05: line 91-93 `function m.split(uri)` | ○ |
| C-59 | isValid: URI検証true | E-05: line 97-109 `function m.isValid(uri)` | ○ |
| C-60 | isValid: 無効URI検証 | E-05: line 105-107 `if scheme ~= 'file' then return false end` | ○ |
| C-61 | normalize: URI正規化 | E-05: line 111-116 `function m.normalize(uri)` | ○ |

### files.lua（C-62〜C-82）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-62 | open: ファイルオープン | E-06: line 120-125 `function m.open(uri)` | ○ |
| C-63 | close: ファイルクローズ | E-06: line 129-141 `function m.close(uri)` | ○ |
| C-64 | isOpen: オープン確認true | E-06: line 146-148 `function m.isOpen(uri)` | ○ |
| C-65 | isOpen: クローズ確認false | E-06: line 147 `return m.openMap[uri] ~= nil` | ○ |
| C-66 | setText: テキスト設定 | E-06: line 233-303 `function m.setText(uri, text, isTrust, callback)` | ○ |
| C-67 | setText: nilテキスト | E-06: line 234-236 `if not text then return end` | ○ |
| C-68 | setText: サイズ制限 | E-06: line 237-241 10MB以上で警告 | ○ |
| C-69 | getText: テキスト取得 | E-06: line 393-399 `function m.getText(uri)` | ○ |
| C-70 | getText: 存在しないファイル | E-06: line 394-396 `if not file then return nil end` | ○ |
| C-71 | remove: ファイル削除 | E-06: line 470-484 `function m.remove(uri)` | ○ |
| C-72 | exists: 存在確認 | E-06: line 187-189 `function m.exists(uri)` | ○ |
| C-73 | getAllUris: URI一覧取得 | E-06: line 489-503 `function m.getAllUris(suri)` | ○ |
| C-74 | eachFile: ファイル走査 | E-06: line 507-522 `function m.eachFile(suri)` | ○ |
| C-75 | isLua: Lua判定true | E-06: line 820-828 `function m.isLua(uri)` | ○ |
| C-76 | isLua: 非Lua判定false | E-06: line 821 `.lua`拡張子チェック | ○ |
| C-77 | isDll: DLL判定 | E-06: line 833-848 `function m.isDll(uri)` | ○ |
| C-78 | saveDll: DLL保存 | E-06: line 853-880 `function m.saveDll(uri, content)` | ○ |
| C-79 | compileState: コンパイル | E-06: line 673-725 `function m.compileState(uri)` | ○ |
| C-80 | getState: 状態取得 | E-06: line 736-743 `function m.getState(uri)` | ○ |
| C-81 | watch: ウォッチ登録 | E-06: line 1017-1019 `function m.watch(callback)` | ○ |
| C-82 | normalize: パス正規化 | E-06: line 990-1013 `function m.normalize(path)` | ○ |

### filewatch.lua（C-83〜C-86）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-83 | watch: ファイル監視 | E-07: line 41-74 `function m.watch(path, recursive, filter)` | ○ |
| C-84 | watch: 空パス | E-07: line 42-43 `if path == '' ... then return function () end` | ○ |
| C-85 | event: イベント登録 | E-07: line 77-79 `function m.event(callback)` | ○ |
| C-86 | update: 更新処理 | E-07: line 89-126 `function m.update()` | ○ |

### fs-utility.lua（C-87〜C-97）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-87 | loadFile: ファイル読み込み | E-08: line 18-39 `function m.loadFile(path, keepBom)` | ○ |
| C-88 | loadFile: BOM除去 | E-08: line 29-37 BOM処理 | ○ |
| C-89 | loadFile: ファイル不存在 | E-08: line 24-26 `if not f then return nil, e end` | ○ |
| C-90 | saveFile: ファイル保存 | E-08: line 44-58 `function m.saveFile(path, content)` | ○ |
| C-91 | saveFile: 保存失敗 | E-08: line 56-57 `return false, e` | ○ |
| C-92 | relative: 相対パス計算 | E-08: line 60-69 `function m.relative(path, base)` | ○ |
| C-93 | dummyfs __div: パス結合 | E-08: line 116-127 `function dfs:__div(filename)` | ○ |
| C-94 | dummyfs isDirectory: ディレクトリ判定 | E-08: line 196-202 `function dfs:isDirectory()` | ○ |
| C-95 | dummyfs exists: 存在確認 | E-08: line 213-216 `function dfs:exists()` | ○ |
| C-96 | fileCopy: ファイルコピー | E-08: line 621-629 `function m.fileCopy(source, target, option)` | ○ |
| C-97 | fileSync: ディレクトリ同期 | E-08: line 635-643 `function m.fileSync(source, target, option)` | ○ |

### gc.lua（C-98〜C-101）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-98 | add: GC追加 | E-09: line 91-101 `function mt:add(obj)` | ○ |
| C-99 | add: 削除済みGC | E-09: line 92-95 `if self._removed then destroyGCObject(obj) return nil end` | ○ |
| C-100 | remove: GC削除 | E-09: line 75-84 `function mt:remove()` | ○ |
| C-101 | remove: 二重削除 | E-09: line 76-78 `if self._removed then return end` | ○ |

### inspect.lua（C-102〜C-105）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-102 | inspect: テーブル表示 | E-10: line 301-329 `function inspect.inspect(root, options)` | ○ |
| C-103 | inspect: ネストテーブル | E-10: line 252-272 ネスト処理 | ○ |
| C-104 | inspect: 循環参照 | E-10: line 141-154 `function countCycles(x, cycles)` | ○ |
| C-105 | inspect: 深さ制限 | E-10: line 244-245 `if self.level >= self.depth then puts(buf, '{...}')` | ○ |

### json-beautify.lua（C-106〜C-108）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-106 | beautify: JSON整形 | E-11: line 167-170 `local function beautify(v, option)` | ○ |
| C-107 | beautify: インデント設定 | E-11: line 29-33 `defaultOpt` | ○ |
| C-108 | beautify: 循環参照エラー | E-11: line 66-68 `error("circular reference")` | ○ |

### json-edit.lua（C-109〜C-112）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-109 | edit add操作 | E-12: line 605-641 `function OP.add(str, option, path, value)` | ○ |
| C-110 | edit remove操作 | E-12: line 644-674 `function OP.remove(str, _, path)` | ○ |
| C-111 | edit replace操作 | E-12: line 676-711 `function OP.replace(str, option, path, value)` | ○ |
| C-112 | edit 無効op | E-12: line 715-717 `if not f then error(...)` | ○ |

### json.lua（C-113〜C-120）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-113 | encode: テーブル変換 | E-13: line 260-265 `function json.encode(v)` | ○ |
| C-114 | encode: 配列変換 | E-13: line 202-247 配列処理 | ○ |
| C-115 | encode: 循環参照エラー | E-13: line 173-175 `if statusVisited[t] then error("circular reference") end` | ○ |
| C-116 | decode: JSON変換 | E-13: line 538-553 `function json.decode(str)` | ○ |
| C-117 | decode: 配列変換 | E-13: line 450-460 `local function decode_array()` | ○ |
| C-118 | decode: 無効JSON | E-13: line 295-297 `function decode_error(msg)` | ○ |
| C-119 | createEmptyObject: 空オブジェクト | E-13: line 63-65 `function json.createEmptyObject()` | ○ |
| C-120 | isObject: オブジェクト判定 | E-13: line 67-72 `function json.isObject(t)` | ○ |

### jsonc.lua（C-121〜C-123）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-121 | decode_jsonc: コメント付きJSON | E-14: line 354-372 `function json.decode_jsonc(str)` | ○ |
| C-122 | decode_jsonc: ブロックコメント | E-14: line 98-106 ブロックコメント処理 | ○ |
| C-123 | decode_jsonc: 末尾カンマ | E-14: line 336-341 末尾カンマ許容 | ○ |

### jsonrpc.lua（C-124〜C-127）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-124 | encode: RPCエンコード | E-15: line 10-15 `function m.encode(pack)` | ○ |
| C-125 | decode: RPCデコード | E-15: line 49-71 `function m.decode(reader)` | ○ |
| C-126 | decode: 接続切断 | E-15: line 23-25 `return nil, 'Disconnected!'` | ○ |
| C-127 | decode: 不正ヘッダ | E-15: line 55-56 `return nil, 'Proto header error'` | ○ |

### language.lua（C-128〜C-130）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-128 | (call): 言語設定 | E-16: line 135-143 `__call` | ○ |
| C-129 | (index): 翻訳読み込み | E-16: line 130-134 `__index` | ○ |
| C-130 | (call on table): テンプレート展開 | E-16: line 103-124 `__call` | ○ |

### lazy-cacher.lua（C-131〜C-134）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-131 | writterAndReader: キャッシャー作成 | E-17: line 58-157 `function mt:writterAndReader(fileID)` | ○ |
| C-132 | writter: データ書き込み | E-17: line 95-134 writter関数 | ○ |
| C-133 | reader: データ読み込み | E-17: line 137-155 reader関数 | ○ |
| C-134 | reader: 存在しないID | E-17: line 138-140 `if not map[id] then return nil end` | ○ |

### lazytable.lua（C-135〜C-138）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-135 | build: ビルダー作成 | E-18: line 334-349 `function m.build(t, writter, reader)` | ○ |
| C-136 | entry: エントリ取得 | E-18: line 181-325 `function mt:entry()` | ○ |
| C-137 | exclude: 除外設定 | E-18: line 175-178 `function mt:exclude(t)` | ○ |
| C-138 | bind: バインド | E-18: line 160-172 `function mt:bind(writter, reader)` | ○ |

### lclient.lua（C-139〜C-145）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-139 | start: クライアント開始 | E-19: line 113-157 `function mt:start(callback)` | ○ |
| C-140 | initialize: 初期化 | E-19: line 92-96 `function mt:initialize(params)` | ○ |
| C-141 | notify: 通知送信 | E-19: line 168-174 `function mt:notify(method, params)` | ○ |
| C-142 | request: リクエスト送信 | E-19: line 177-190 `function mt:request(method, params, callback)` | ○ |
| C-143 | awaitRequest: 待機リクエスト | E-19: line 193-205 `function mt:awaitRequest(method, params)` | ○ |
| C-144 | register: ハンドラ登録 | E-19: line 238-240 `function mt:register(method, callback)` | ○ |
| C-145 | gc: GC追加 | E-19: line 159-161 `function mt:gc(obj)` | ○ |

### linked-table.lua（C-146〜C-157）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-146 | pushHead: 先頭追加 | E-21: line 88-90 `function mt:pushHead(node)` | ○ |
| C-147 | pushTail: 末尾追加 | E-21: line 93-96 `function mt:pushTail(node)` | ○ |
| C-148 | pop: ノード削除 | E-21: line 67-84 `function mt:pop(node)` | ○ |
| C-149 | pop: 存在しないノード | E-21: line 68-70 `if not self:isValidNode(node) then return false end` | ○ |
| C-150 | has: 存在確認 | E-21: line 13-15 `function mt:has(node)` | ○ |
| C-151 | getHead: 先頭取得 | E-21: line 112-114 `function mt:getHead()` | ○ |
| C-152 | getTail: 末尾取得 | E-21: line 129-131 `function mt:getTail()` | ○ |
| C-153 | getSize: サイズ取得 | E-21: line 167-169 `function mt:getSize()` | ○ |
| C-154 | pairs: 順方向走査 | E-21: line 174-201 `function mt:pairs(start, revert)` | ○ |
| C-155 | pairs: 逆方向走査 | E-21: line 176-187 `if revert then` | ○ |
| C-156 | replace: ノード置換 | E-21: line 144-164 `function mt:replace(old, new)` | ○ |
| C-157 | reset: リセット | E-21: line 215-220 `function mt:reset()` | ○ |

### locale-loader.lua（C-158）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-158 | (call): ロケールロード | E-22: line 24-28 `return function (text, path, results)` | ○ |

### log.lua（C-159〜C-166）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-159 | init: ログ初期化 | E-23: line 137-163 `function m.init(root, path)` | ○ |
| C-160 | trace: traceログ | E-23: line 71-73 `function m.trace(...)` | ○ |
| C-161 | debug: debugログ | E-23: line 75-77 `function m.debug(...)` | ○ |
| C-162 | info: infoログ | E-23: line 79-81 `function m.info(...)` | ○ |
| C-163 | warn: warnログ | E-23: line 83-85 `function m.warn(...)` | ○ |
| C-164 | error: errorログ | E-23: line 87-92 `function m.error(...)` | ○ |
| C-165 | raw: rawログ | E-23: line 94-135 `function m.raw(...)` | ○ |
| C-166 | raw: サイズ制限 | E-23: line 122-125 `if m.size > m.maxSize then` | ○ |

### plugin.lua（C-167〜C-169）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-167 | dispatch: イベントディスパッチ | E-24: line 24-52 `function m.dispatch(event, uri, ...)` | ○ |
| C-168 | dispatch: プラグインエラー | E-24: line 46-48 `if not suc then m.showError(scp, res1) failed = failed + 1 end` | ○ |
| C-169 | getPluginInterfaces: インターフェース取得 | E-24: line 54-61 `function m.getPluginInterfaces(uri)` | ○ |

### progress.lua（C-170〜C-174）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-170 | create: プログレス作成 | E-25: line 155-168 `function m.create(uri, title, delay)` | ○ |
| C-171 | remove: プログレス削除 | E-25: line 30-47 `function mt:remove()` | ○ |
| C-172 | setMessage: メッセージ設定 | E-25: line 55-62 `function mt:setMessage(message)` | ○ |
| C-173 | setPercentage: パーセンテージ設定 | E-25: line 66-73 `function mt:setPercentage(per)` | ○ |
| C-174 | cancel: キャンセル | E-25: line 171-178 `function m.cancel(token)` | ○ |

### string-merger.lua（C-175〜C-177）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-175 | mergeDiff: 差分マージ | E-26: line 51-76 `function m.mergeDiff(text, diffs)` | ○ |
| C-176 | getOffset: オフセット取得 | E-26: line 83-109 `function m.getOffset(info, offset)` | ○ |
| C-177 | getOffsetBack: 逆オフセット取得 | E-26: line 116-146 `function m.getOffsetBack(info, offset)` | ○ |

### text-merger.lua（C-178〜C-179）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-178 | (call): テキストマージ | E-27: line 101-115 `return function (text, rows, changes)` | ○ |
| C-179 | (call): 全置換 | E-27: line 107-108 `rows = nil; text = change.text` | ○ |

### timer.lua（C-180〜C-190）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-180 | wait: タイマー作成 | E-28: line 185-194 `function m.wait(timeout, onTimer)` | ○ |
| C-181 | loop: ループタイマー | E-28: line 196-204 `function m.loop(timeout, onTimer)` | ○ |
| C-182 | timer: 回数制限タイマー | E-28: line 206-218 `function m.timer(timeout, count, onTimer)` | ○ |
| C-183 | remove: タイマー削除 | E-28: line 123-126 `function mt:remove()` | ○ |
| C-184 | pause: 一時停止 | E-28: line 128-146 `function mt:pause()` | ○ |
| C-185 | resume: 再開 | E-28: line 148-156 `function mt:resume()` | ○ |
| C-186 | restart: リスタート | E-28: line 158-175 `function mt:restart()` | ○ |
| C-187 | remaining: 残り時間取得 | E-28: line 177-179 `function mt:remaining()` | ○ |
| C-188 | clock: 時刻取得 | E-28: line 220-222 `function m.clock()` | ○ |
| C-189 | update: タイマー更新 | E-28: line 224-238 `function m.update()` | ○ |
| C-190 | timeJump: 時間ジャンプ | E-28: line 240-242 `function m.timeJump(delta)` | ○ |

### tracy.lua（C-191〜C-192）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-191 | enable: tracy有効化 | E-29: line 3-17 `local function enable()` | ○ |
| C-192 | disable: tracy無効化 | E-29: line 19-25 `local function disable()` | ○ |

### utility.lua（C-193〜C-227）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-193 | dump: テーブルダンプ | E-30: line 92-193 `function m.dump(tbl, option)` | ○ |
| C-194 | dump: 非テーブル | E-30: line 96-98 `if type(tbl) ~= 'table' then return ('%s'):format(tbl) end` | ○ |
| C-195 | equal: テーブル等価true | E-30: line 199-238 `function m.equal(valueA, valueB)` | ○ |
| C-196 | equal: テーブル非等価false | E-30: line 217-220 `if not res then return false end` | ○ |
| C-197 | loadFile: ファイル読み込み | E-30: line 302-322 `function m.loadFile(path, keepBom)` | ○ |
| C-198 | loadFile: ファイル不存在 | E-30: line 304-306 `if not f then return nil, e end` | ○ |
| C-199 | saveFile: ファイル保存 | E-30: line 329-339 `function m.saveFile(path, content)` | ○ |
| C-200 | counter: カウンター | E-30: line 345-354 `function m.counter(init, step)` | ○ |
| C-201 | sortPairs: ソートイテレータ | E-30: line 361-373 `function m.sortPairs(t, sorter)` | ○ |
| C-202 | deepCopy: 深コピー | E-30: line 379-398 `function m.deepCopy(source, target)` | ○ |
| C-203 | deepCopy: 循環参照コピー | E-30: line 385-387 `if mark[a] then return mark[a] end` | ○ |
| C-204 | unpack: シリアライズ | E-30: line 403-427 `function m.unpack(t)` | ○ |
| C-205 | pack: デシリアライズ | E-30: line 432-453 `function m.pack(t)` | ○ |
| C-206 | defer: defer | E-30: line 456-459 `function m.defer(callback)` | ○ |
| C-207 | viewString: 文字列表示 | E-30: line 472-509 `function m.viewString(str, quo)` | ○ |
| C-208 | viewString: 長括弧表示 | E-30: line 493-505 長括弧処理 | ○ |
| C-209 | utf8Len: UTF-8長 | E-30: line 529-542 `function m.utf8Len(str, start, finish)` | ○ |
| C-210 | revertArray: 配列反転 | E-30: line 547-557 `function m.revertArray(arr)` | ○ |
| C-211 | revertMap: マップ反転 | E-30: line 563-569 `function m.revertMap(t)` | ○ |
| C-212 | eachLine: 行イテレート | E-30: line 618-655 `function m.eachLine(text, keepNL)` | ○ |
| C-213 | trim: トリム | E-30: line 738-746 `function m.trim(str, mode)` | ○ |
| C-214 | trim: 左トリム | E-30: line 739-741 `if mode == "left" then` | ○ |
| C-215 | expandPath: パス展開 | E-30: line 751-765 `function m.expandPath(path, env)` | ○ |
| C-216 | arrayToHash: 配列ハッシュ化 | E-30: line 770-776 `function m.arrayToHash(l)` | ○ |
| C-217 | switch: switch作成 | E-30: line 835-841 `function m.switch()` | ○ |
| C-218 | switch case: ケース追加 | E-30: line 787-790 `function switchMT:case(name)` | ○ |
| C-219 | switch call: コールバック設定 | E-30: line 794-804 `function switchMT:call(callback)` | ○ |
| C-220 | switch __call: switch実行 | E-30: line 826-832 `function switchMT:__call(name, ...)` | ○ |
| C-221 | stringStartWith: 先頭一致 | E-30: line 863-869 `function m.stringStartWith(str, head, ignoreCase)` | ○ |
| C-222 | stringEndWith: 末尾一致 | E-30: line 875-881 `function m.stringEndWith(str, tail, ignoreCase)` | ○ |
| C-223 | arrayHas: 配列包含 | E-30: line 949-956 `function m.arrayHas(array, value)` | ○ |
| C-224 | arrayInsert: 配列追加 | E-30: line 967-971 `function m.arrayInsert(array, value)` | ○ |
| C-225 | arrayRemove: 配列削除 | E-30: line 973-980 `function m.arrayRemove(array, value)` | ○ |
| C-226 | tableMerge: テーブルマージ | E-30: line 1017-1022 `function m.tableMerge(a, b)` | ○ |
| C-227 | split: 文字列分割 | E-30: line 1238-1251 `function m.split(str, sep)` | ○ |

### version.lua（C-228〜C-229）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-228 | getVersion: バージョン取得 | E-31: line 22-28 `function m.getVersion()` | ○ |
| C-229 | getVersion: バージョン不明 | E-31: line 24 `m.version = loadVersion() or '<Unknown>'` | ○ |

### without-check-nil.lua（C-230〜C-234）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-230 | enable: nil安全有効化 | E-32: line 116-118 `function m.enable()` | ○ |
| C-231 | disable: nil安全無効化 | E-32: line 120-124 `function m.disable()` | ○ |
| C-232 | __add: nil加算 | E-32: line 4-8 `mt.__add` | ○ |
| C-233 | __concat: nil連結 | E-32: line 37-41 `mt.__concat` | ○ |
| C-234 | __index: nil添字 | E-32: line 55 `mt.__index = function () end` | ○ |

## 4) 不足情報（Unknown / Missing）
- なし（全テストケースがソースコードに基づいて生成されている）

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 全テストケースがソースコードの関数定義に基づいている
- 注意点：
  - プラグインシステム（plugin.lua）のテストは実際のプラグイン環境が必要
  - ファイルシステム操作のテストは実際のファイル/ディレクトリが必要
  - タイマー関連のテストは時間経過の検証が必要

## 6) レビュアーチェックリスト（最小）
- [ ] 各モジュールの主要機能（高優先度）のテストケースが網羅されているか
- [ ] 境界値テスト（空配列、null、最大値など）が適切に設定されているか
- [ ] 異常系テスト（エラーハンドリング）が適切に設定されているか
- [ ] 依存関係のあるモジュール（files, client, plugin等）のモック方針が明確か
- [ ] 非同期処理（await, timer）のテスト方針が適切か
