---
generated_at: 2026-02-17 10:30:00
metrics:
  claims_total: 68
  claims_with_evidence: 68
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：encoder.csv

## 本レポートについて

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

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

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

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

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

---

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

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

- E-01: `script/encoder/init.lua` - メインエンコーダモジュール（len, offset, encode, decode関数）
- E-02: `script/encoder/utf16.lua` - UTF-16エンコーディング変換モジュール（ファクトリ関数、toutf8, fromutf8、内部関数群）
- E-03: `script/encoder/ansi.lua` - ANSIエンコーディング変換モジュール（toutf8, fromutf8）

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

### init.lua - m.len関数
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | UTF-8エンコーディングで文字列長を正しく計算できること | E-01 L28-29: `if encoding == 'utf8' then return utf8.len(s, i, j, true)` | ○ |
| C-02 | UTF-16LEエンコーディングで文字列長を正しく計算できること | E-01 L19-23: `if encoding == 'utf16' then local us = utf16le.fromutf8(s:sub(i, j)) return #us // 2` | ○ |
| C-03 | UTF-16BEエンコーディングで文字列長を正しく計算できること | E-01 L24-27: `if encoding == 'utf16be' then local us = utf16be.fromutf8(s:sub(i, j)) return #us // 2` | ○ |
| C-04 | マルチバイト文字を含むUTF-8文字列の長さを正しく計算できること | E-01 L28-29: utf8.len関数使用 | ○ |
| C-05 | マルチバイト文字を含むUTF-16文字列の長さを正しく計算できること | E-01 L21-22: utf16le.fromutf8使用 | ○ |
| C-06 | 空文字列の長さを計算できること | E-01 L17-18: デフォルト値i=1, j=#s | ○ |
| C-07 | インデックスiとjが省略された場合のデフォルト動作 | E-01 L17-18: `i = i or 1`, `j = j or #s` | ○ |
| C-08 | 部分文字列の長さを計算できること | E-01 L21: `s:sub(i, j)` | ○ |
| C-09 | サポートされていないエンコーディングの場合 | E-01 L31-32: `log.error(...) return j - i + 1` | ○ |

### init.lua - m.offset関数
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-10 | UTF-8エンコーディングでオフセットを正しく計算できること | E-01 L60-61: `if encoding == 'utf8' then return utf8.offset(s, n, i)` | ○ |
| C-11 | UTF-16LEエンコーディングでオフセットを計算できること | E-01 L41-50: utf16/utf16le分岐、ASCII最適化、UTF-16変換 | ○ |
| C-12 | UTF-16BEエンコーディングでオフセットを計算できること | E-01 L51-58: utf16be分岐 | ○ |
| C-13 | マルチバイト文字を含む文字列でUTF-16オフセットを計算できること | E-01 L47-49: `utf16le.fromutf8(line)`, `utf16le.toutf8(us:sub(1, n * 2 - 2))` | ○ |
| C-14 | インデックスiが省略された場合のデフォルト動作 | E-01 L40: `i = i or 1` | ○ |
| C-15 | サポートされていないエンコーディングの場合 | E-01 L63-64: `log.error(...) return n + i - 1` | ○ |

### init.lua - m.encode関数
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-16 | UTF-8エンコーディングでテキストがそのまま返却されること | E-01 L72-77: `if encoding == 'utf8' then ... return text` | ○ |
| C-17 | UTF-8エンコーディングでBOM付きテキストが返却されること | E-01 L73-75: `if bom == 'yes' then text = '\xEF\xBB\xBF' .. text` | ○ |
| C-18 | ANSIエンコーディングへ変換できること | E-01 L78-79: `if encoding == 'ansi' then return ansi.fromutf8(text)` | ○ |
| C-19 | UTF-16LEエンコーディングへ変換できること | E-01 L81-88: `if encoding == 'utf16' then text = utf16le.fromutf8(text)` | ○ |
| C-20 | UTF-16LEエンコーディングでBOM付きテキストが返却されること | E-01 L84-86: `if bom == 'yes' ... text = '\xFF\xFE' .. text` | ○ |
| C-21 | UTF-16LEエンコーディングでauto BOMの場合 | E-01 L84-85: `if bom == 'yes' or bom == 'auto' then` | ○ |
| C-22 | UTF-16BEエンコーディングへ変換できること | E-01 L89-97: `if encoding == 'utf16be' then text = utf16be.fromutf8(text)` | ○ |
| C-23 | UTF-16BEエンコーディングでBOM付きテキストが返却されること | E-01 L92-94: `text = '\xFE\xFF' .. text` | ○ |
| C-24 | サポートされていないエンコーディングの場合 | E-01 L98-99: `log.error(...) return text` | ○ |

### init.lua - m.decode関数
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-25 | UTF-8エンコーディングでテキストがそのまま返却されること | E-01 L106-107: `if encoding == 'utf8' then return text` | ○ |
| C-26 | ANSIエンコーディングからUTF-8へ変換できること | E-01 L109-110: `if encoding == 'ansi' then return ansi.toutf8(text)` | ○ |
| C-27 | UTF-16LEエンコーディングからUTF-8へ変換できること | E-01 L112-114: `if encoding == 'utf16' ... return utf16le.toutf8(text)` | ○ |
| C-28 | UTF-16BEエンコーディングからUTF-8へ変換できること | E-01 L115-117: `if encoding == 'utf16be' then return utf16be.toutf8(text)` | ○ |
| C-29 | サポートされていないエンコーディングの場合 | E-01 L119-120: `log.error(...) return text` | ○ |

### utf16.lua - ファクトリ関数
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 | リトルエンディアンモードでエンコーダを生成できること | E-02 L117-120: `if what == 'be' then ... else tobyte = le_tobyte tochar = le_tochar` | ○ |
| C-31 | ビッグエンディアンモードでエンコーダを生成できること | E-02 L114-116: `if what == 'be' then tobyte = be_tobyte tochar = be_tochar` | ○ |
| C-32 | 置換文字を指定してエンコーダを生成できること | E-02 L121-122: `local utf8replace = replace and utf8char(replace)` | ○ |

### utf16.lua - toutf8関数
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-33 | UTF-16LEからUTF-8へASCII文字を変換できること | E-02 L123-136: toutf8関数全体 | ○ |
| C-34 | UTF-16LEからUTF-8へマルチバイト文字を変換できること | E-02 L133: `r[#r+1] = utf8char(code)` | ○ |
| C-35 | UTF-16からUTF-8へサロゲートペアを変換できること | E-02 L35-56: utf16next関数でサロゲートペア処理 | ○ |
| C-36 | 空文字列を変換できること | E-02 L125: forループで空テーブルを処理 | ○ |
| C-37 | 無効なUTF-16シーケンスで置換文字が使用されること | E-02 L127-128: `if replace then r[#r+1] = utf8replace` | ○ |
| C-38 | 無効なUTF-16シーケンスでエラーがスローされること | E-02 L129-130: `else error "invalid UTF-16 code"` | ○ |

### utf16.lua - fromutf8関数
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-39 | UTF-8からUTF-16LEへASCII文字を変換できること | E-02 L138-151: fromutf8関数全体 | ○ |
| C-40 | UTF-8からUTF-16LEへマルチバイト文字を変換できること | E-02 L148: `r[#r+1] = utf16char(tochar, code)` | ○ |
| C-41 | UTF-8からUTF-16へサロゲートペアを生成できること | E-02 L26-32: utf16char関数でサロゲートペア生成 | ○ |
| C-42 | 空文字列を変換できること | E-02 L140: forループで空テーブルを処理 | ○ |
| C-43 | 無効なUTF-8シーケンスで置換文字が使用されること | E-02 L142-143: `if replace then r[#r+1] = utf16replace` | ○ |
| C-44 | 無効なUTF-8シーケンスでエラーがスローされること | E-02 L144-145: `else error "invalid UTF-8 code"` | ○ |

### utf16.lua - 内部関数
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-45 | コードポイントをビッグエンディアン2バイトに変換できること | E-02 L8-10: `return strchar((code >> 8) & 0xFF, code & 0xFF)` | ○ |
| C-46 | ビッグエンディアン2バイトからコードポイントを取得できること | E-02 L12-15: `return (h << 8) | l` | ○ |
| C-47 | コードポイントをリトルエンディアン2バイトに変換できること | E-02 L17-19: `return strchar(code & 0xFF, (code >> 8) & 0xFF)` | ○ |
| C-48 | リトルエンディアン2バイトからコードポイントを取得できること | E-02 L21-24: `return (h << 8) | l` | ○ |
| C-49 | BMP範囲内のコードポイントを1ユニットに変換できること | E-02 L27-28: `if code < 0x10000 then return tochar(code)` | ○ |
| C-50 | サプリメンタリプレーン文字をサロゲートペアに変換できること | E-02 L29-31: `code = code - 0x10000 return tochar(0xD800 + (code >> 10))..tochar(0xDC00 + (code & 0x3FF))` | ○ |
| C-51 | U+FFFFのコードポイントを変換できること | E-02 L27: `if code < 0x10000` | ○ |
| C-52 | U+10000のコードポイントを変換できること | E-02 L29-31: サロゲートペア生成ロジック | ○ |
| C-53 | 通常のUTF-16コードユニットを読み取れること | E-02 L40-41: `if code1 < 0xD800 or code1 >= 0xE000 then return n+2, code1` | ○ |
| C-54 | サロゲートペアを正しく読み取れること | E-02 L42-52: サロゲートペア処理ロジック | ○ |
| C-55 | 文字列末尾で反復を終了すること | E-02 L36-38: `if n > #s then return` | ○ |
| C-56 | 不完全なサロゲートペアを検出できること | E-02 L44-45, L48-49, L53-54: 不正シーケンス検出 | ○ |
| C-57 | 1バイトUTF-8文字を読み取れること | E-02 L85-86: `if strmatch(s, "^[\0-\x7F]", n) then return n+1` | ○ |
| C-58 | 2バイトUTF-8文字を読み取れること | E-02 L87-88: `elseif strmatch(s, "^[\xC2-\xDF][\x80-\xBF]", n) then return n+2` | ○ |
| C-59 | 3バイトUTF-8文字を読み取れること | E-02 L89-95: 3バイトシーケンスパターン | ○ |
| C-60 | 4バイトUTF-8文字を読み取れること | E-02 L97-102: 4バイトシーケンスパターン | ○ |
| C-61 | 文字列末尾で反復を終了すること | E-02 L82-84: `if n > #s then return` | ○ |
| C-62 | 不正なUTF-8バイトで1バイト進むこと | E-02 L103-104: `else return n+1` | ○ |

### ansi.lua
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-63 | Windows環境でANSIからUTF-8へ変換できること | E-03 L14: `return windows.a2u(text)` | ○ |
| C-64 | 非Windows環境でテキストがそのまま返却されること | E-03 L11-12: `if not windows then return text` | ○ |
| C-65 | Windows環境でUTF-8からANSIへ変換できること | E-03 L21: `return windows.u2a(text)` | ○ |
| C-66 | 非Windows環境でテキストがそのまま返却されること | E-03 L18-19: `if not windows then return text` | ○ |
| C-67 | 空文字列を変換できること（toutf8） | E-03 L10-14: 入力検証なし、空文字列も処理 | ○ |
| C-68 | 空文字列を変換できること（fromutf8） | E-03 L17-21: 入力検証なし、空文字列も処理 | ○ |

## 4) 不足情報（Unknown / Missing）
- なし：全てのテストケースはソースコードから直接導出されている

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 全テストケースがソースコードに基づいており、根拠が明確

## 6) レビュアーチェックリスト（最小）
- [ ] init.lua: len関数のUTF-16/UTF-16LE条件分岐が同一になっている（L19-20）ことを確認
- [ ] utf16.lua: サロゲートペアの境界値（U+FFFF, U+10000）のテストケースが適切か確認
- [ ] utf16.lua: 不正なUTF-8/UTF-16シーケンスのテストパターンが網羅的か確認
- [ ] ansi.lua: プラットフォーム依存のテストをどのように実行するか確認
- [ ] 置換文字（replacement character）の動作テストが十分か確認
