---
generated_at: 2026-03-01 20:35:00
metrics:
  claims_total: 60
  claims_with_evidence: 56
  claims_without_evidence: 4
confidence_derived: 0.93
---

# 根拠レポート: unicode.csv

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.93**
  - 根拠あり：56 / 60、根拠なし：4
- 優先レビュー（高）
  1. **UT-UNI-054（Hangul結合文字）**：具体的なHangul文字のテストケースがコード内に存在しない
  2. **UT-UNI-055（packed struct）**：メモリレイアウトの検証方法が明確でない
  3. **UT-UNI-020/021（エラーケース）**：実際にエラーが発生する条件の再現が困難

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

- E-01: `src/unicode/main.zig` - モジュールエントリーポイント、エクスポート定義
- E-02: `src/unicode/grapheme.zig` - graphemeBreak関数、Precompute構造体、テストコード
- E-03: `src/unicode/props.zig` - Properties構造体、eql/format関数
- E-04: `src/unicode/lut.zig` - Generator、Tables、BlockMap
- E-05: `src/unicode/props_table.zig` - table定義
- E-06: `src/unicode/props_uucode.zig` - get関数、main関数、テストコード
- E-07: `src/unicode/symbols_table.zig` - symbolsテーブル定義
- E-08: `src/unicode/symbols_uucode.zig` - シンボル判定、テストコード

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | graphemeBreakで絵文字とモディファイアの組み合わせでブレークなし | E-02 (test "grapheme break: emoji modifier" L126-133) | ○ |
| C-02 | 非絵文字と絵文字モディファイアでブレークあり | E-02 (test "grapheme break: emoji modifier" L135-139) | ○ |
| C-03 | 長いZWJシーケンスで正しくブレーク判定 | E-02 (test "long emoji zwj sequences" L142-180) | ○ |
| C-04 | 状態が連続呼び出しで正しく更新 | E-02 (graphemeBreak関数 L20-21: state更新) | ○ |
| C-05 | コードポイント0x0000での動作 | E-02 (graphemeBreak関数はu21型を受け入れる) | ○ |
| C-06 | コードポイント最大値での動作 | E-02 (Precompute.dataは全範囲をカバー) | ○ |
| C-07 | Keyからインデックス計算 | E-02 (Precompute.Key.index L34-36) | ○ |
| C-08 | 事前計算データが8KB | E-02 (assert L77: @sizeOf == 8192) | ○ |
| C-09 | Properties.eqlで同じプロパティがtrue | E-03 (eql関数 L27-32) | ○ |
| C-10 | widthが異なる場合にfalse | E-03 (eql関数 L28: a.width == b.width) | ○ |
| C-11 | width_zero_in_graphemeが異なる場合にfalse | E-03 (eql関数 L29) | ○ |
| C-12 | grapheme_breakが異なる場合にfalse | E-03 (eql関数 L30) | ○ |
| C-13 | emoji_vs_baseが異なる場合にfalse | E-03 (eql関数 L31) | ○ |
| C-14 | Propertiesのフォーマット出力 | E-03 (format関数 L35-52) | ○ |
| C-15 | デフォルト値が正しく設定 | E-03 (Properties定義 L14-24: デフォルト値) | ○ |
| C-16 | Generatorでテーブル生成 | E-04 (generate関数 L51-126) | ○ |
| C-17 | stage1サイズがu16範囲内 | E-04 (assert L110) | ○ |
| C-18 | stage2サイズがu16範囲内 | E-04 (assert L111) | ○ |
| C-19 | stage3サイズがu16範囲内 | E-04 (assert L112) | ○ |
| C-20 | ブロックサイズ超過エラー | E-04 (L84: error.BlockTooLarge) | ○ |
| C-21 | Stage2サイズ超過エラー | E-04 (L100: error.Stage2TooLarge) | ○ |
| C-22 | Tables.getでマッピング取得 | E-04 (get関数 L141-144) | ○ |
| C-23 | コードポイント0x0000で動作 | E-04 (get関数はu21を受け入れる) | ○ |
| C-24 | コードポイント0x10FFFFで動作 | E-04 (generate関数 L68: maxInt(u21)) | ○ |
| C-25 | ASCII範囲で動作 | E-04 (get関数のアルゴリズム) | ○ |
| C-26 | Zigコードとして正しく出力 | E-04 (writeZig関数 L150-186) | ○ |
| C-27 | stage1配列が正しく出力 | E-04 (writeZig L156-158) | ○ |
| C-28 | stage2配列が正しく出力 | E-04 (writeZig L160-167) | ○ |
| C-29 | stage3配列が正しく出力 | E-04 (writeZig L169-184) | ○ |
| C-30 | ASCII文字の幅取得 | E-05, E-06 (table経由でprops取得) | ○ |
| C-31 | 全角文字の幅取得 | E-05, E-06 (uucode.get(.width, cp)) | ○ |
| C-32 | ゼロ幅文字判定 | E-05, E-06 (width=0の場合) | ○ |
| C-33 | get関数でProperties取得 | E-06 (get関数 L8-22) | ○ |
| C-34 | max_code_point超えでデフォルト値 | E-06 (get関数 L9-14) | ○ |
| C-35 | widthがuucodeと一致 | E-06 (L17: uucode.get(.width, cp)) | ○ |
| C-36 | width_zero_in_graphemeがuucodeと一致 | E-06 (L18: uucode.get(.wcwidth_zero_in_grapheme, cp)) | ○ |
| C-37 | grapheme_breakがuucodeと一致 | E-06 (L19: uucode.get(.grapheme_break_no_control, cp)) | ○ |
| C-38 | emoji_vs_baseがuucodeと一致 | E-06 (L20: uucode.get(.is_emoji_vs_base, cp)) | ○ |
| C-39 | main関数でテーブル出力 | E-06 (main関数 L25-64) | ○ |
| C-40 | テーブルがuucodeと一致 | E-06 (test "unicode props: tables match uucode" L66-85) | ○ |
| C-41 | シンボル文字判定 | E-07, E-08 (table.get) | ○ |
| C-42 | 非シンボル文字判定 | E-07, E-08 (table.get) | ○ |
| C-43 | シンボルテーブル出力 | E-08 (main関数 L6-48) | ○ |
| C-44 | シンボルテーブルがuucodeと一致 | E-08 (test "unicode symbols: tables match uucode" L50-68) | ○ |
| C-45 | max_code_point超えでfalse | E-08 (L16-17: cp > max_code_point -> false) | ○ |
| C-46 | Context.eqlで同値がtrue | E-08 (L22-25: a == b) | ○ |
| C-47 | Context.eqlで異値がfalse | E-08 (L22-25: a == b) | ○ |
| C-48 | lutモジュールエクスポート | E-01 (L1: pub const lut) | ○ |
| C-49 | tableエクスポート | E-01 (L4: pub const table) | ○ |
| C-50 | Propertiesエクスポート | E-01 (L5: pub const Properties) | ○ |
| C-51 | graphemeBreakエクスポート | E-01 (L6: pub const graphemeBreak) | ○ |
| C-52 | ZWJ結合判定 | E-02 (test "long emoji zwj sequences": ZWJ=0x200D) | ○ |
| C-53 | Regional Indicatorペア判定 | E-02 (graphemeBreak関数の仕様) | ○ |
| C-54 | Hangul結合文字判定 | **根拠なし** | △ |
| C-55 | packed structレイアウト | **根拠なし** | △ |
| C-56 | BlockMapハッシュ計算 | E-04 (BlockMap.hash L32-37) | ○ |
| C-57 | BlockMap同等ブロック判定 | E-04 (BlockMap.eql L39-42) | ○ |
| C-58 | BlockMap異ブロック判定 | E-04 (BlockMap.eql L39-42) | ○ |
| C-59 | Context.get関数 | E-06 (Context L33-35) | ○ |
| C-60 | Context.eql関数 | E-06 (Context L38-40) | ○ |

## 4) 不足情報（Unknown / Missing）
- **Hangul結合文字のテストケース**：grapheme.zigにHangul専用のテストが存在しない。Unicodeグラフェムクラスタルールに基づく動作は推測
  - 候補：Unicode Grapheme Cluster Break仕様書 / uucodeライブラリのテスト / 追加テストの実装
- **packed structのメモリレイアウト検証**：Properties構造体がpacked structとして定義されているが、具体的なレイアウト検証コードは存在しない
  - 候補：Zigコンパイラの@sizeOf/@alignOf検証 / メモリダンプによる確認
- **エラーケースの再現条件**：BlockTooLarge、Stage2TooLargeエラーは通常の使用では発生しない可能性が高い
  - 候補：意図的に大量のユニークなマッピングを生成するテストコード
- **Regional Indicatorの具体的テスト**：国旗絵文字のテストケースはコード内に明示的に存在しない
  - 候補：絵文字テストスイートの追加 / Unicode標準テストデータの活用

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**: モジュールエクスポート、基本的なプロパティアクセス
- **0（低リスク）**: 既存テストでカバーされている絵文字・ZWJ処理
- **1（中リスク）**: ルックアップテーブル生成・検索のエッジケース
- **1（中リスク）**: Hangul文字や特殊なUnicode範囲の処理
- **2（高リスク）**: エラーパスの検証（BlockTooLarge、Stage2TooLarge）

## 6) レビュアーチェックリスト（最小）
- [ ] graphemeBreak関数のテストカバレッジが十分か確認（絵文字、ZWJ、Regional Indicator）
- [ ] Properties構造体のフィールドがuucodeライブラリと整合しているか確認
- [ ] ルックアップテーブルの3段階検索アルゴリズムが正しく動作するか確認
- [ ] 境界値（コードポイント0x0000、0x10FFFF）でのエッジケース処理
- [ ] エラーパス（BlockTooLarge、Stage2TooLarge）の発生条件とハンドリング
- [ ] 生成されたZigコードがコンパイル可能であることの確認
- [ ] Valgrind環境でスキップされるテストの代替検証方法
