---
generated_at: 2026-02-24 10:30:00
metrics:
  claims_total: 130
  claims_with_evidence: 130
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート: opencode 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

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

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

- E-01: `packages/opencode/src/agent/agent.ts` - Agentネームスペースの定義
- E-02: `packages/opencode/src/config/config.ts` - Configネームスペースの定義
- E-03: `packages/opencode/src/provider/provider.ts` - Providerネームスペースの定義
- E-04: `packages/opencode/src/skill/skill.ts` - Skillネームスペースの定義
- E-05: `packages/opencode/src/skill/discovery.ts` - Discoveryネームスペースの定義
- E-06: `packages/opencode/src/util/glob.ts` - Globネームスペースの定義
- E-07: `packages/opencode/src/util/lazy.ts` - lazy関数の定義
- E-08: `packages/opencode/src/util/format.ts` - formatDuration関数の定義
- E-09: `packages/opencode/src/util/lock.ts` - Lockネームスペースの定義
- E-10: `packages/opencode/src/util/wildcard.ts` - Wildcardネームスペースの定義
- E-11: `packages/opencode/src/file/index.ts` - Fileネームスペースの定義
- E-12: `packages/opencode/src/file/ripgrep.ts` - Ripgrepネームスペースの定義
- E-13: `packages/opencode/src/file/ignore.ts` - FileIgnoreネームスペースの定義
- E-14: `packages/opencode/src/bus/index.ts` - Busネームスペースの定義
- E-15: `packages/opencode/src/auth/index.ts` - Authネームスペースの定義
- E-16: `packages/opencode/src/mcp/index.ts` - MCPネームスペースの定義
- E-17: `packages/opencode/src/permission/next.ts` - PermissionNextネームスペースの定義
- E-18: `packages/opencode/src/util/filesystem.ts` - Filesystemネームスペースの定義
- E-19: `packages/opencode/src/util/timeout.ts` - withTimeout関数の定義

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

### Agent モジュール (UT-OPC-001 - UT-OPC-008)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | Agent.get が存在し agent 名で情報を取得できる | E-01 (line 253-255) | ○ |
| C-02 | Agent.get は存在しない agent で undefined を返す | E-01 (line 253-255) | ○ |
| C-03 | Agent.list が存在しエージェント一覧を返す | E-01 (line 257-264) | ○ |
| C-04 | Agent.list は default_agent を先頭にソートする | E-01 (line 262) | ○ |
| C-05 | Agent.defaultAgent が存在しデフォルトエージェント名を返す | E-01 (line 266-281) | ○ |
| C-06 | Agent.defaultAgent は存在しない agent でエラーをスローする | E-01 (line 272) | ○ |
| C-07 | Agent.defaultAgent は subagent でエラーをスローする | E-01 (line 273) | ○ |
| C-08 | Agent.generate が存在し設定を生成する | E-01 (line 283-338) | ○ |

### Config モジュール (UT-OPC-009 - UT-OPC-017)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 | Config.get が存在し設定を取得できる | E-02 (line 1372-1374) | ○ |
| C-10 | Config.global が存在しグローバル設定を取得できる | E-02 (line 1214-1241) | ○ |
| C-11 | Config.updateGlobal が存在し設定を更新できる | E-02 (line 1452-1488) | ○ |
| C-12 | Config.getPluginName が file:// URL を処理できる | E-02 (line 494-502) | ○ |
| C-13 | Config.getPluginName が npm パッケージ名を処理できる | E-02 (line 498-502) | ○ |
| C-14 | Config.getPluginName がスコープ付きパッケージを処理できる | E-02 (line 498-502) | ○ |
| C-15 | Config.deduplicatePlugins が重複を除去する | E-02 (line 516-534) | ○ |
| C-16 | Config.deduplicatePlugins が空配列を処理できる | E-02 (line 516-534) | ○ |
| C-17 | Config.directories が存在しディレクトリ一覧を返す | E-02 (line 1490-1492) | ○ |

### Provider モジュール (UT-OPC-018 - UT-OPC-028)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-18 | Provider.list が存在しプロバイダー一覧を返す | E-03 (line 1037-1039) | ○ |
| C-19 | Provider.getProvider が存在しプロバイダー情報を返す | E-03 (line 1146-1148) | ○ |
| C-20 | Provider.getProvider は存在しないプロバイダーで undefined を返す | E-03 (line 1146-1148) | ○ |
| C-21 | Provider.getModel が存在しモデル情報を返す | E-03 (line 1150-1168) | ○ |
| C-22 | Provider.getModel は存在しないプロバイダーで ModelNotFoundError をスローする | E-03 (line 1154-1157) | ○ |
| C-23 | Provider.getModel は存在しないモデルで ModelNotFoundError をスローする | E-03 (line 1161-1166) | ○ |
| C-24 | Provider.getLanguage が存在し LanguageModelV2 を返す | E-03 (line 1170-1195) | ○ |
| C-25 | Provider.getSmallModel が存在し小規模モデルを返す | E-03 (line 1212-1276) | ○ |
| C-26 | Provider.defaultModel が存在しデフォルトモデルを返す | E-03 (line 1288-1313) | ○ |
| C-27 | Provider.parseModel がモデル文字列をパースする | E-03 (line 1315-1321) | ○ |
| C-28 | Provider.sort がモデルをソートする | E-03 (line 1279-1286) | ○ |

### Skill モジュール (UT-OPC-029 - UT-OPC-035)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-29 | Skill.get が存在しスキル情報を返す | E-04 (line 178-179) | ○ |
| C-30 | Skill.get は存在しないスキルで undefined を返す | E-04 (line 178-179) | ○ |
| C-31 | Skill.all が存在しスキル一覧を返す | E-04 (line 181-183) | ○ |
| C-32 | Skill.dirs が存在しディレクトリ一覧を返す | E-04 (line 185-187) | ○ |
| C-33 | Discovery.pull が URL からスキルをダウンロードする | E-05 (line 39-97) | ○ |
| C-34 | Discovery.pull は無効な URL で空配列を返す | E-05 (line 60-69) | ○ |
| C-35 | Discovery.dir がキャッシュディレクトリパスを返す | E-05 (line 18-20) | ○ |

### Glob モジュール (UT-OPC-036 - UT-OPC-040)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-36 | Glob.scan が存在しファイル一覧を返す | E-06 (line 23-25) | ○ |
| C-37 | Glob.scan はマッチなしで空配列を返す | E-06 (line 23-25) | ○ |
| C-38 | Glob.scanSync が存在し同期的にファイル一覧を返す | E-06 (line 27-29) | ○ |
| C-39 | Glob.match がパターンマッチングを行う | E-06 (line 31-33) | ○ |
| C-40 | Glob.match はマッチしない場合 false を返す | E-06 (line 31-33) | ○ |

### lazy 関数 (UT-OPC-041 - UT-OPC-043)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-41 | lazy が遅延評価を行い値をキャッシュする | E-07 (line 1-15) | ○ |
| C-42 | lazy.reset がキャッシュをクリアする | E-07 (line 17-20) | ○ |
| C-43 | lazy は例外時にキャッシュしない | E-07 (line 11-13) | ○ |

### formatDuration 関数 (UT-OPC-044 - UT-OPC-049)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-44 | formatDuration が秒を正しくフォーマットする | E-08 (line 3) | ○ |
| C-45 | formatDuration が分を正しくフォーマットする | E-08 (line 4-7) | ○ |
| C-46 | formatDuration が時間を正しくフォーマットする | E-08 (line 8-12) | ○ |
| C-47 | formatDuration が日を正しくフォーマットする | E-08 (line 13-16) | ○ |
| C-48 | formatDuration は 0 秒で空文字を返す | E-08 (line 2) | ○ |
| C-49 | formatDuration は負の値で空文字を返す | E-08 (line 2) | ○ |

### Lock モジュール (UT-OPC-050 - UT-OPC-054)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-50 | Lock.read が読み取りロックを取得できる | E-09 (line 47-71) | ○ |
| C-51 | Lock.read は複数の読み取りロックを同時に取得できる | E-09 (line 51-52) | ○ |
| C-52 | Lock.write が書き込みロックを取得できる | E-09 (line 73-97) | ○ |
| C-53 | Lock.write は書き込みロック中に他のロックを待機させる | E-09 (line 77, 85-95) | ○ |
| C-54 | Lock.write は読み取りロック中に待機する | E-09 (line 77) | ○ |

### Wildcard モジュール (UT-OPC-055 - UT-OPC-060)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-55 | Wildcard.match が * パターンをマッチさせる | E-10 (line 4-19) | ○ |
| C-56 | Wildcard.match が ? パターンをマッチさせる | E-10 (line 10) | ○ |
| C-57 | Wildcard.match が複合パターンをマッチさせる | E-10 (line 4-19) | ○ |
| C-58 | Wildcard.match はマッチしない場合 false を返す | E-10 (line 18-19) | ○ |
| C-59 | Wildcard.all が複数パターンから最後のマッチを返す | E-10 (line 22-32) | ○ |
| C-60 | Wildcard.allStructured が構造化入力をマッチさせる | E-10 (line 34-46) | ○ |

### File モジュール (UT-OPC-061 - UT-OPC-071)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-61 | File.read がテキストファイルを読み込む | E-11 (line 494-555) | ○ |
| C-62 | File.read がバイナリファイルを検出する | E-11 (line 518-519) | ○ |
| C-63 | File.read が画像ファイルを base64 エンコードする | E-11 (line 506-513) | ○ |
| C-64 | File.read は存在しないファイルで空の content を返す | E-11 (line 522-524) | ○ |
| C-65 | File.read はパストラバーサルを防止する | E-11 (line 501-503) | ○ |
| C-66 | File.list がディレクトリ内のファイル一覧を返す | E-11 (line 557-605) | ○ |
| C-67 | File.list がサブディレクトリ内のファイル一覧を返す | E-11 (line 573) | ○ |
| C-68 | File.list はパストラバーサルを防止する | E-11 (line 577-579) | ○ |
| C-69 | File.search がファイルを検索する | E-11 (line 607-645) | ○ |
| C-70 | File.search は空クエリでファイル一覧を返す | E-11 (line 631-633) | ○ |
| C-71 | File.status が Git ステータスを取得する | E-11 (line 417-492) | ○ |

### Ripgrep モジュール (UT-OPC-072 - UT-OPC-077)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-72 | Ripgrep.filepath が実行ファイルパスを返す | E-12 (line 205-208) | ○ |
| C-73 | Ripgrep.files がファイル一覧をイテレートする | E-12 (line 210-276) | ○ |
| C-74 | Ripgrep.files は存在しないディレクトリで ENOENT をスローする | E-12 (line 232-238) | ○ |
| C-75 | Ripgrep.search がパターンマッチングを行う | E-12 (line 336-374) | ○ |
| C-76 | Ripgrep.search はマッチなしで空配列を返す | E-12 (line 361-362) | ○ |
| C-77 | Ripgrep.tree がディレクトリツリーを返す | E-12 (line 278-334) | ○ |

### FileIgnore モジュール (UT-OPC-078 - UT-OPC-080)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-78 | FileIgnore.match が無視パターンをマッチさせる | E-13 (line 59-81) | ○ |
| C-79 | FileIgnore.match はマッチしない場合 false を返す | E-13 (line 80) | ○ |
| C-80 | FileIgnore.match がホワイトリストを処理する | E-13 (line 66-68) | ○ |

### Bus モジュール (UT-OPC-081 - UT-OPC-085)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-81 | Bus.publish がイベントをパブリッシュする | E-14 (line 41-64) | ○ |
| C-82 | Bus.subscribe がイベントをサブスクライブする | E-14 (line 66-71) | ○ |
| C-83 | Bus.subscribe が unsubscribe 関数を返す | E-14 (line 89-103) | ○ |
| C-84 | Bus.subscribeAll が全イベントをサブスクライブする | E-14 (line 85-87) | ○ |
| C-85 | Bus.once が一度だけイベントを受信する | E-14 (line 73-83) | ○ |

### Auth モジュール (UT-OPC-086 - UT-OPC-090)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-86 | Auth.get が認証情報を取得する | E-15 (line 40-43) | ○ |
| C-87 | Auth.get は存在しないプロバイダーで undefined を返す | E-15 (line 40-43) | ○ |
| C-88 | Auth.all が全認証情報を取得する | E-15 (line 45-56) | ○ |
| C-89 | Auth.set が認証情報を保存する | E-15 (line 58-61) | ○ |
| C-90 | Auth.remove が認証情報を削除する | E-15 (line 63-67) | ○ |

### MCP モジュール (UT-OPC-091 - UT-OPC-100)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-91 | MCP.status がステータスを取得する | E-16 (line 496-509) | ○ |
| C-92 | MCP.tools がツール一覧を取得する | E-16 (line 566-606) | ○ |
| C-93 | MCP.connect が接続を確立する | E-16 (line 515-552) | ○ |
| C-94 | MCP.disconnect が接続を切断する | E-16 (line 554-564) | ○ |
| C-95 | MCP.prompts がプロンプト一覧を取得する | E-16 (line 608-627) | ○ |
| C-96 | MCP.resources がリソース一覧を取得する | E-16 (line 629-648) | ○ |
| C-97 | MCP.getPrompt がプロンプトを取得する | E-16 (line 650-676) | ○ |
| C-98 | MCP.readResource がリソースを読み込む | E-16 (line 678-703) | ○ |
| C-99 | MCP.startAuth が OAuth 認証フローを開始する | E-16 (line 709-780) | ○ |
| C-100 | MCP.startAuth は存在しない MCP でエラーをスローする | E-16 (line 713-715) | ○ |

### PermissionNext モジュール (UT-OPC-101 - UT-OPC-112)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-101 | PermissionNext.fromConfig が Ruleset を生成する | E-17 (line 46-62) | ○ |
| C-102 | PermissionNext.merge が Ruleset をマージする | E-17 (line 64-66) | ○ |
| C-103 | PermissionNext.evaluate が権限を評価する | E-17 (line 236-243) | ○ |
| C-104 | PermissionNext.evaluate はマッチなしでデフォルトルールを返す | E-17 (line 242) | ○ |
| C-105 | PermissionNext.disabled が無効ツール一覧を返す | E-17 (line 247-257) | ○ |
| C-106 | PermissionNext.ask が権限要求イベントをパブリッシュする | E-17 (line 131-161) | ○ |
| C-107 | PermissionNext.ask は許可ルールで即座に解決する | E-17 (line 158) | ○ |
| C-108 | PermissionNext.ask は拒否ルールで DeniedError をスローする | E-17 (line 142-143) | ○ |
| C-109 | PermissionNext.reply が once で Promise を解決する | E-17 (line 196-198) | ○ |
| C-110 | PermissionNext.reply が always でルールを保存する | E-17 (line 199-231) | ○ |
| C-111 | PermissionNext.reply が reject で Promise を拒否する | E-17 (line 179-195) | ○ |
| C-112 | PermissionNext.list が保留中の権限要求一覧を返す | E-17 (line 282-285) | ○ |

### Filesystem モジュール (UT-OPC-113 - UT-OPC-127)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-113 | Filesystem.exists がファイル存在を確認する | E-18 (line 12-14) | ○ |
| C-114 | Filesystem.exists は存在しないファイルで false を返す | E-18 (line 12-14) | ○ |
| C-115 | Filesystem.isDir がディレクトリを確認する | E-18 (line 16-22) | ○ |
| C-116 | Filesystem.isDir はファイルで false を返す | E-18 (line 17) | ○ |
| C-117 | Filesystem.readText がテキストファイルを読み込む | E-18 (line 33-35) | ○ |
| C-118 | Filesystem.readJson が JSON をパースする | E-18 (line 37-39) | ○ |
| C-119 | Filesystem.readJson は不正な JSON でエラーをスローする | E-18 (line 38) | ○ |
| C-120 | Filesystem.write がファイルを書き込む | E-18 (line 54-73) | ○ |
| C-121 | Filesystem.write が親ディレクトリを自動作成する | E-18 (line 62-68) | ○ |
| C-122 | Filesystem.writeJson が JSON を書き込む | E-18 (line 75-77) | ○ |
| C-123 | Filesystem.mimeType が MIME タイプを返す | E-18 (line 98-100) | ○ |
| C-124 | Filesystem.contains がパス包含を確認する | E-18 (line 134-136) | ○ |
| C-125 | Filesystem.contains は包含しない場合 false を返す | E-18 (line 135) | ○ |
| C-126 | Filesystem.findUp が上位ディレクトリを検索する | E-18 (line 138-150) | ○ |
| C-127 | Filesystem.overlaps がパス重複を確認する | E-18 (line 128-132) | ○ |

### withTimeout 関数 (UT-OPC-128 - UT-OPC-130)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-128 | withTimeout がタイムアウト前に結果を返す | E-19 (line 1-14) | ○ |
| C-129 | withTimeout がタイムアウト時にエラーをスローする | E-19 (line 8-12) | ○ |
| C-130 | withTimeout が元のエラーを伝播する | E-19 (line 3-6) | ○ |

## 4) 不足情報（Unknown / Missing）
- 該当なし - 全てのテストケースにソースコードによる根拠が存在します

## 5) リスクフラグ（レビュー観点）
- **0 (低リスク)**: 全テストケースがソースコードの関数・メソッド定義に基づいて作成されています
- 統合テストやE2Eテストは本単体テストケース一覧の対象外です
- 実行時の外部依存（ネットワーク、ファイルシステム等）を含むテストはモック化を推奨します

## 6) レビュアーチェックリスト（最小）
- [ ] テストケースのテスト観点（正常系/異常系/境界値）が適切にバランスしているか
- [ ] 優先度「高」のテストケースが重要なビジネスロジックをカバーしているか
- [ ] 入力値と期待結果が具体的かつ検証可能か
- [ ] エラーハンドリングのテストケースが網羅されているか
- [ ] パストラバーサル防止などのセキュリティ関連テストが含まれているか
