---
generated_at: 2026-03-01 20:30:00
metrics:
  claims_total: 81
  claims_with_evidence: 81
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：benchmark.csv

## 本レポートについて

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

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

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

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

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

---

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

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

- E-01: `src/benchmark/main.zig`（モジュールエントリーポイント、全ベンチマークのインポート定義）
- E-02: `src/benchmark/Benchmark.zig`（ベンチマーク基盤クラス、init/run/VTable/RunMode/RunResult/Error定義、既存テストケース含む）
- E-03: `src/benchmark/cli.zig`（CLIエントリーポイント、Action enum、main/mainAction/mainActionImpl関数定義）
- E-04: `src/benchmark/options.zig`（dataFile関数定義、stdin/-/通常ファイル処理）
- E-05: `src/benchmark/TerminalStream.zig`（TerminalStreamベンチマーク、Options/create/destroy/benchmark/setup/teardown/step/Handler定義、既存テストケース含む）
- E-06: `src/benchmark/CodepointWidth.zig`（CodepointWidthベンチマーク、Options/Mode/create/destroy/benchmark/setup/teardown/stepNoop/stepWcwidth/stepTable/stepSimd定義、既存テストケース含む）
- E-07: `src/benchmark/GraphemeBreak.zig`（GraphemeBreakベンチマーク、Options/Mode/create/destroy/benchmark/setup/teardown/stepNoop/stepTable定義、既存テストケース含む）
- E-08: `src/benchmark/ScreenClone.zig`（ScreenCloneベンチマーク、Options/Mode/create/destroy/benchmark/setup/teardown/stepNoop/stepClone/stepRender定義）
- E-09: `src/benchmark/TerminalParser.zig`（TerminalParserベンチマーク、Options/create/destroy/benchmark/setup/teardown/step定義、既存テストケース含む）
- E-10: `src/benchmark/IsSymbol.zig`（IsSymbolベンチマーク、Options/Mode/create/destroy/benchmark/setup/teardown/stepUucode/stepTable定義、既存テストケース含む）
- E-11: `src/benchmark/OscParser.zig`（OscParserベンチマーク、Options/create/destroy/benchmark/setup/teardown/step定義、既存テストケース含む）
- E-12: `src/benchmark/CApi.zig`（C API export関数 ghostty_benchmark_cli定義）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | Benchmark.init: 有効なポインタとvtableでBenchmarkが初期化される | E-02: L17-26 `pub fn init` | ○ |
| C-02 | Benchmark.init: ポインタ以外の型が渡された場合はコンパイルエラー | E-02: L21-24 assert文による型チェック | ○ |
| C-03 | Benchmark.run: onceモードで1回だけstepが実行される | E-02: L29-88 `pub fn run`, L76 `.once => true` | ○ |
| C-04 | Benchmark.run: durationモードで指定時間実行される | E-02: L77 `.duration => |ns| now.since(start) >= ns` | ○ |
| C-05 | Benchmark.run: setupFnが最初に呼び出される | E-02: L35 `if (self.vtable.setupFn) |func| try func(self.ptr)` | ○ |
| C-06 | Benchmark.run: teardownFnが最後に呼び出される | E-02: L36 `defer if (self.vtable.teardownFn)` | ○ |
| C-07 | Benchmark.run: stepFnエラーが伝播する | E-02: L70 `try self.vtable.stepFn(self.ptr)` | ○ |
| C-08 | Benchmark.run: setupFnエラーが伝播する | E-02: L35 `try func(self.ptr)` | ○ |
| C-09 | RunResult: 初期値がiterations=0, duration=0 | E-02: L103-112 struct定義 | ○ |
| C-10 | Action.Struct: 各アクションに対応する構造体を返却 | E-03: L25-35 `pub fn Struct` switch文 | ○ |
| C-11 | Action.Struct: terminal-streamでTerminalStream型を返却 | E-03: L28 `.@"terminal-stream" => @import("TerminalStream.zig")` | ○ |
| C-12 | cli.main: 有効なアクションでベンチマークが実行される | E-03: L39-44 `pub fn main()` | ○ |
| C-13 | cli.main: アクションなしでNoActionエラー | E-03: L42 `const action = action_ orelse return error.NoAction` | ○ |
| C-14 | cli.mainAction: 各アクションが正しく実行される | E-03: L55-66 `pub fn mainAction` | ○ |
| C-15 | cli.mainActionImpl: オプション解析とベンチマーク作成 | E-03: L68-100 `fn mainActionImpl` | ○ |
| C-16 | options.dataFile: 有効なファイルパスでファイルハンドルを返却 | E-04: L16-17 `std.fs.cwd().openFile(path, .{})` | ○ |
| C-17 | options.dataFile: path_がnullの場合にnullを返却 | E-04: L10 `const path = path_ orelse return null` | ○ |
| C-18 | options.dataFile: "-"でstdinを返却 | E-04: L13 `if (std.mem.eql(u8, path, "-")) return .stdin()` | ○ |
| C-19 | options.dataFile: 存在しないファイルでエラー | E-04: L16 `try std.fs.cwd().openFile` | ○ |
| C-20 | TerminalStream.create: インスタンス生成 | E-05: L51-69 `pub fn create` | ○ |
| C-21 | TerminalStream.create: ターミナルサイズ設定 | E-05: L60-63 `.terminal = try .init(alloc, .{rows, cols})` | ○ |
| C-22 | TerminalStream.destroy: リソース解放 | E-05: L71-74 `pub fn destroy` | ○ |
| C-23 | TerminalStream.benchmark: Benchmarkインスタンス返却 | E-05: L76-82 `pub fn benchmark` | ○ |
| C-24 | TerminalStream.setup: ターミナルリセット | E-05: L88 `self.terminal.fullReset()` | ○ |
| C-25 | TerminalStream.setup: データファイルオープン | E-05: L93 `self.data_f = options.dataFile(self.opts.data)` | ○ |
| C-26 | TerminalStream.setup: ファイルオープン失敗時エラー | E-05: L93-96 `catch |err| ... return error.BenchmarkFailed` | ○ |
| C-27 | TerminalStream.teardown: ファイルハンドルクローズ | E-05: L99-105 `fn teardown` f.close() | ○ |
| C-28 | TerminalStream.step: ファイルデータをstreamで処理 | E-05: L107-133 `fn step` stream.nextSlice() | ○ |
| C-29 | TerminalStream.step: data_fがnullなら何もしない | E-05: L115 `const f = self.data_f orelse return` | ○ |
| C-30 | Handler.vt: printアクションで文字出力 | E-05: L141-150 `pub fn vt` switch | ○ |
| C-31 | CodepointWidth.create: インスタンス生成 | E-06: L53-61 `pub fn create` | ○ |
| C-32 | CodepointWidth.destroy: リソース解放 | E-06: L63-65 `pub fn destroy` | ○ |
| C-33 | CodepointWidth.benchmark: noopモードでstepNoopが設定 | E-06: L69-70 `.noop => stepNoop` | ○ |
| C-34 | CodepointWidth.benchmark: wcwidthモードでstepWcwidthが設定 | E-06: L71 `.wcwidth => stepWcwidth` | ○ |
| C-35 | CodepointWidth.benchmark: tableモードでstepTableが設定 | E-06: L72 `.table => stepTable` | ○ |
| C-36 | CodepointWidth.benchmark: simdモードでstepSimdが設定 | E-06: L73 `.simd => stepSimd` | ○ |
| C-37 | CodepointWidth.setup: データファイルオープン | E-06: L80-90 `fn setup` | ○ |
| C-38 | CodepointWidth.stepNoop: 何も処理しない | E-06: L100-102 `fn stepNoop` | ○ |
| C-39 | CodepointWidth.stepWcwidth: wcwidth関数呼び出し | E-06: L106-131 `fn stepWcwidth` wcwidth(cp) | ○ |
| C-40 | CodepointWidth.stepTable: テーブルベース幅計算 | E-06: L133-163 `fn stepTable` table.get().width | ○ |
| C-41 | CodepointWidth.stepSimd: SIMD幅計算 | E-06: L165-190 `fn stepSimd` simd.codepointWidth(cp) | ○ |
| C-42 | GraphemeBreak.create: インスタンス生成 | E-07: L45-53 `pub fn create` | ○ |
| C-43 | GraphemeBreak.destroy: リソース解放 | E-07: L55-57 `pub fn destroy` | ○ |
| C-44 | GraphemeBreak.benchmark: noopモードでstepNoopが設定 | E-07: L61-62 `.noop => stepNoop` | ○ |
| C-45 | GraphemeBreak.benchmark: tableモードでstepTableが設定 | E-07: L63 `.table => stepTable` | ○ |
| C-46 | GraphemeBreak.stepNoop: UTF-8デコードのみ | E-07: L90-111 `fn stepNoop` d.next(c) | ○ |
| C-47 | GraphemeBreak.stepTable: graphemeBreak判定 | E-07: L113-141 `fn stepTable` unicode.graphemeBreak() | ○ |
| C-48 | ScreenClone.create: インスタンス生成 | E-08: L53-69 `pub fn create` | ○ |
| C-49 | ScreenClone.create: ターミナルが指定サイズで初期化 | E-08: L62-65 `.terminal = try .init(alloc, .{rows, cols})` | ○ |
| C-50 | ScreenClone.destroy: リソース解放 | E-08: L71-74 `pub fn destroy` | ○ |
| C-51 | ScreenClone.benchmark: noopモードでstepNoopが設定 | E-08: L79 `.noop => stepNoop` | ○ |
| C-52 | ScreenClone.benchmark: cloneモードでstepCloneが設定 | E-08: L80 `.clone => stepClone` | ○ |
| C-53 | ScreenClone.benchmark: renderモードでstepRenderが設定 | E-08: L81 `.render => stepRender` | ○ |
| C-54 | ScreenClone.setup: ターミナルリセットとスタイル適用 | E-08: L88-128 `fn setup` fullReset(), vtStream() | ○ |
| C-55 | ScreenClone.stepNoop: 1000回の値コピー | E-08: L135-144 `fn stepNoop` for (0..1000) | ○ |
| C-56 | ScreenClone.stepClone: 1000回のscreen.clone() | E-08: L146-166 `fn stepClone` s.clone() | ○ |
| C-57 | ScreenClone.stepClone: clone失敗時エラー | E-08: L157-159 `catch |err| ... return error.BenchmarkFailed` | ○ |
| C-58 | ScreenClone.stepRender: 1000回のRenderState更新 | E-08: L168-196 `fn stepRender` state.update() | ○ |
| C-59 | TerminalParser.create: インスタンス生成 | E-09: L27-35 `pub fn create` | ○ |
| C-60 | TerminalParser.destroy: リソース解放 | E-09: L37-39 `pub fn destroy` | ○ |
| C-61 | TerminalParser.benchmark: Benchmarkインスタンス返却 | E-09: L41-47 `pub fn benchmark` | ○ |
| C-62 | TerminalParser.setup: データファイルオープン | E-09: L49-59 `fn setup` | ○ |
| C-63 | TerminalParser.step: パーサーがバイトごとに処理 | E-09: L69-97 `fn step` p.next(c) | ○ |
| C-64 | TerminalParser.step: data_fがnullなら何もしない | E-09: L77 `const f = self.data_f orelse return` | ○ |
| C-65 | IsSymbol.create: インスタンス生成 | E-10: L43-51 `pub fn create` | ○ |
| C-66 | IsSymbol.destroy: リソース解放 | E-10: L53-55 `pub fn destroy` | ○ |
| C-67 | IsSymbol.benchmark: uucodeモードでstepUucodeが設定 | E-10: L60 `.uucode => stepUucode` | ○ |
| C-68 | IsSymbol.benchmark: tableモードでstepTableが設定 | E-10: L61 `.table => stepTable` | ○ |
| C-69 | IsSymbol.stepUucode: uucode.get()呼び出し | E-10: L88-113 `fn stepUucode` uucode.get(.is_symbol, cp) | ○ |
| C-70 | IsSymbol.stepTable: symbols_table.get()呼び出し | E-10: L115-140 `fn stepTable` symbols_table.get(cp) | ○ |
| C-71 | OscParser.create: インスタンス生成 | E-11: L30-42 `pub fn create` | ○ |
| C-72 | OscParser.create: パーサー初期化 | E-11: L39 `.parser = .init(alloc)` | ○ |
| C-73 | OscParser.destroy: パーサーとメモリ解放 | E-11: L44-47 `pub fn destroy` parser.deinit() | ○ |
| C-74 | OscParser.benchmark: Benchmarkインスタンス返却 | E-11: L49-55 `pub fn benchmark` | ○ |
| C-75 | OscParser.setup: ファイルオープンとパーサーリセット | E-11: L57-68 `fn setup` parser.reset() | ○ |
| C-76 | OscParser.step: OSCシーケンスパース | E-11: L78-107 `fn step` Parser.next(), parser.end() | ○ |
| C-77 | OscParser.step: バッファサイズ超過でエラー | E-11: L96 `if (len > osc_buf.len) return error.BenchmarkFailed` | ○ |
| C-78 | OscParser.step: EndOfStreamで正常終了 | E-11: L87-89 `error.EndOfStream => return` | ○ |
| C-79 | ghostty_benchmark_cli: 有効なアクションで実行成功 | E-12: L8-33 `export fn ghostty_benchmark_cli` | ○ |
| C-80 | ghostty_benchmark_cli: 不明なアクションでfalse | E-12: L16-18 `orelse ... return false` | ○ |
| C-81 | ghostty_benchmark_cli: 実行失敗でfalse | E-12: L25-30 `catch |err| ... return false` | ○ |

## 4) 不足情報（Unknown / Missing）
- なし：全テストケースはソースコードの関数・メソッド定義に基づいて生成されています。

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 全テストケースにソースコード根拠あり
- 0: 低リスク - benchmarkモジュールは内部テストツールであり、プロダクション機能への影響は限定的
- 1: 中リスク - C API (CApi.zig) は外部からの呼び出しがあるため、境界条件のテストが重要

## 6) レビュアーチェックリスト（最小）
- [ ] Benchmark.run の durationモードで実際に時間計測が正しく行われるか確認
- [ ] 各ベンチマーク実装（TerminalStream, CodepointWidth等）の step 関数でファイルI/Oエラー時の挙動が適切か確認
- [ ] C API (ghostty_benchmark_cli) の入力バリデーションが十分か確認
- [ ] ScreenClone.stepClone/stepRenderでメモリリークが発生しないか確認（コメントに意図的にメモリを解放しない旨の記述あり）
- [ ] 各モード別ステップ関数（noop/table/simd/wcwidth等）のカバレッジが実際のユースケースを網羅しているか確認
