---
generated_at: 2026-01-30 12:00:00
metrics:
  claims_total: 72
  claims_with_evidence: 70
  claims_without_evidence: 2
confidence_derived: 0.97
---

# 根拠レポート：crdt.csv

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧（crdt.csv）の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：70 / 72、根拠なし：2
- 優先レビュー（高）
  1. **UT-CRDT-019**：負のミリ秒値に対するparseの挙動は実装上の境界条件として推測
  2. **UT-CRDT-070**：merkle.pruneのエラーケースはコード上存在するが発生条件が稀

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

- E-01: `packages/crdt/src/crdt/timestamp.ts` - Timestampクラス、MutableTimestampクラス、Clock関数群の実装
- E-02: `packages/crdt/src/crdt/merkle.ts` - Merkle Trie関連関数の実装
- E-03: `packages/crdt/src/crdt/index.ts` - エクスポート定義
- E-04: `packages/crdt/src/index.ts` - Protocol Bufferエクスポート
- E-05: `packages/crdt/src/proto/sync_pb.ts` - Protocol Buffer型定義
- E-06: `packages/crdt/src/proto/sync_pb.js` - Protocol Buffer実装（自動生成）
- E-07: `packages/crdt/README.md` - パッケージ概要（参考）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | Timestamp.constructorで_stateに値が設定される | E-01 (L97-102) | ○ |
| C-02 | Timestamp.toStringのフォーマット仕様 | E-01 (L109-114) | ○ |
| C-03 | カウンタ0の場合のパディング | E-01 (L112) | ○ |
| C-04 | カウンタ最大値(0xFFFF)の出力 | E-01 (L88, L112) | ○ |
| C-05 | valueOfがtoStringを返却 | E-01 (L105-106) | ○ |
| C-06 | millis()アクセサ | E-01 (L117-118) | ○ |
| C-07 | counter()アクセサ | E-01 (L121-122) | ○ |
| C-08 | node()アクセサ | E-01 (L125-126) | ○ |
| C-09 | hash()でmurmurhash.v3使用 | E-01 (L1, L129-130) | ○ |
| C-10 | Timestamp.initのオプションなし初期化 | E-01 (L136-151) | ○ |
| C-11 | maxDriftオプション適用 | E-01 (L137-139) | ○ |
| C-12 | nodeオプション適用とパディング | E-01 (L146-148) | ○ |
| C-13 | Timestamp.parseの正常パース | E-01 (L166-189) | ○ |
| C-14 | Timestampインスタンスのparse通過 | E-01 (L167-169) | ○ |
| C-15 | 不正形式でnull返却 | E-01 (L170-188) | ○ |
| C-16 | パーツ不足でnull返却 | E-01 (L172) | ○ |
| C-17 | MAX_COUNTER超過でnull | E-01 (L88, L180) | ○ |
| C-18 | MAX_NODE_LENGTH超過でnull | E-01 (L89, L182) | ○ |
| C-19 | 負のミリ秒でnull | E-01 (L177-178) | △ |
| C-20 | send()の単調性保証 | E-01 (L195-230) | ○ |
| C-21 | 物理時刻進行時のカウンタリセット | E-01 (L211) | ○ |
| C-22 | 同一物理時刻でのカウンタ増加 | E-01 (L211) | ○ |
| C-23 | clock未初期化時のnull返却(send) | E-01 (L196-198) | ○ |
| C-24 | ClockDriftError発生条件(send) | E-01 (L214-216) | ○ |
| C-25 | OverflowError発生条件(send) | E-01 (L217-219) | ○ |
| C-26 | recv()のマージ処理 | E-01 (L235-292) | ○ |
| C-27 | ローカル優先の時刻選択 | E-01 (L265-273) | ○ |
| C-28 | リモート優先の時刻選択 | E-01 (L265-273) | ○ |
| C-29 | clock未初期化時のnull返却(recv) | E-01 (L236-238) | ○ |
| C-30 | リモートドリフト検出 | E-01 (L251-253) | ○ |
| C-31 | recv時のOverflow | E-01 (L279-281) | ○ |
| C-32 | Timestamp.zero定義 | E-01 (L298-300) | ○ |
| C-33 | Timestamp.max定義 | E-01 (L158-160) | ○ |
| C-34 | Timestamp.since関数 | E-01 (L302) | ○ |
| C-35 | DuplicateNodeError | E-01 (L307-312) | ○ |
| C-36 | ClockDriftError | E-01 (L314-321) | ○ |
| C-37 | OverflowError | E-01 (L323-328) | ○ |
| C-38 | InvalidError | E-01 (L330-335) | ○ |
| C-39 | MutableTimestamp.from | E-01 (L339-345) | ○ |
| C-40 | setMillis | E-01 (L347-349) | ○ |
| C-41 | setCounter | E-01 (L351-353) | ○ |
| C-42 | setNode | E-01 (L355-357) | ○ |
| C-43 | setClock/getClock | E-01 (L37-43) | ○ |
| C-44 | makeClock | E-01 (L45-47) | ○ |
| C-45 | makeClockのデフォルトmerkle | E-01 (L45) | ○ |
| C-46 | serializeClock | E-01 (L49-54) | ○ |
| C-47 | deserializeClock正常系 | E-01 (L56-77) | ○ |
| C-48 | deserializeClockのJSON例外処理 | E-01 (L59-65) | ○ |
| C-49 | deserializeClockの無効timestamp例外 | E-01 (L69-71) | ○ |
| C-50 | makeClientIdの16文字 | E-01 (L79-81) | ○ |
| C-51 | ハイフン除去 | E-01 (L80) | ○ |
| C-52 | emptyTrie | E-02 (L24-26) | ○ |
| C-53 | getKeysの数値キー抽出 | E-02 (L32-34) | ○ |
| C-54 | getKeysのhash除外 | E-02 (L28-29) | ○ |
| C-55 | keyToTimestamp変換 | E-02 (L36-43) | ○ |
| C-56 | 空キーで0返却 | E-02 (L39-42) | ○ |
| C-57 | 16文字パディング | E-02 (L39) | ○ |
| C-58 | insert処理 | E-02 (L48-54) | ○ |
| C-59 | XORハッシュ更新 | E-02 (L52, L65) | ○ |
| C-60 | 深いキーパス作成 | E-02 (L56-68) | ○ |
| C-61 | build関数 | E-02 (L70-76) | ○ |
| C-62 | 空配列で空Trie | E-02 (L71-72) | ○ |
| C-63 | diff同一でnull | E-02 (L79-81) | ○ |
| C-64 | diff差分で時刻返却 | E-02 (L78-139) | ○ |
| C-65 | 部分一致の差分検出 | E-02 (L91-126) | ○ |
| C-66 | 空Trieとの比較 | E-02 (L133-134) | ○ |
| C-67 | pruneのブランチ保持 | E-02 (L141-164) | ○ |
| C-68 | 空Trieのprune | E-02 (L143-145) | ○ |
| C-69 | 再帰prune | E-02 (L160) | ○ |
| C-70 | prune時のエラー | E-02 (L156-158) | △ |
| C-71 | debug関数 | E-02 (L166-181) | ○ |
| C-72 | debugのインデント | E-02 (L167-170, L177) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-19（負のミリ秒でnull）**: コード上 `millis >= 0` のチェックは存在する（L178）が、1969年12月31日のISO文字列がどのようにパースされるかはDate.parse()の実装依存。テスト時に実動作確認が必要。
  - 候補：Date.parseの仕様確認 / ブラウザ・Node.js間の差異確認

- **C-70（pruneエラーケース）**: コード上 `throw new Error()` は存在する（L157-158）が、正常なTrie操作では到達しない防御的コード。テスト時に意図的な不整合Trieの作成が必要。
  - 候補：不整合Trieの作成方法調査 / エラーハンドリングの必要性判断

## 5) リスクフラグ（レビュー観点）
- **リスク0（低リスク）**:
  - デバッグ関数（debug）: 本番影響なし
  - エラークラスのメッセージ: 運用上の影響軽微

- **リスク1（中リスク）**:
  - makeClientId: UUID生成の一意性はuuid v4に依存
  - keyToTimestamp: base3変換のパディング処理

- **リスク2（高リスク）**:
  - send/recv: クロック同期の整合性、分散システムの一貫性に直結
  - diff: 同期判定の正確性、データ損失リスク
  - ClockDriftError/OverflowError: 異常検出の確実性

## 6) レビュアーチェックリスト（最小）
- [ ] Timestamp.send()の単調性保証がテストで確認されているか
- [ ] Timestamp.recv()のマージロジックが各条件分岐をカバーしているか
- [ ] merkle.diff()の差分検出精度が同期要件を満たすか
- [ ] ClockDriftError, OverflowErrorの閾値が運用環境に適切か（maxDrift: 5分）
- [ ] merkle.prune()のn=2がメモリ/精度のトレードオフとして妥当か
- [ ] Protocol Buffer定義（sync_pb.ts/js）は自動生成のため単体テスト対象外としてよいか確認
