---
generated_at: 2026-02-21 22:25:00
metrics:
  claims_total: 50
  claims_with_evidence: 47
  claims_without_evidence: 3
confidence_derived: 0.94
---

# 根拠レポート：network.csv

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.94**
  - 根拠あり：47 / 50、根拠なし：3
- 優先レビュー（高）
  1. **C-17 (UT-NET-017)**：Server.stopListening()のべき等性は実装詳細に依存
  2. **C-20 (UT-NET-020)**：CloseableSocket.close()のべき等性は継承元実装に依存
  3. **C-40, C-41, C-49, C-50**：境界値テストの期待結果は実装依存

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

- E-01: `src/network/IPProtocolVersion.php` - IPProtocolVersion enum定義（IPV6=6, IPV4=4）
- E-02: `src/network/IPProtocolBehavior.php` - IPProtocolBehavior enum定義（PREFER_IPV6=0, FORCE_IPV6=6, FORCE_IPV4=4）
- E-03: `src/network/SocketOptions.php` - SocketOptions type定義（?'SO_REUSEADDR' => bool）
- E-04: `src/network/Socket.php` - Socket interface定義（TAddress, getLocalAddress(), getPeerAddress()）
- E-05: `src/network/Server.php` - Server interface定義（TAddress, nextConnectionAsync(), getLocalAddress(), stopListening()）
- E-06: `src/network/CloseableSocket.php` - CloseableSocket interface定義（extends Socket, IO\CloseableReadWriteHandle）
- E-07: `src/network/_Private/socket_accept_async.php` - socket_accept_async()関数実装
- E-08: `src/network/_Private/resolve_hostname.php` - resolve_hostname()関数実装
- E-09: `src/network/_Private/socket_create_bind_listen_async.php` - socket_create_bind_listen_async()関数実装
- E-10: `src/network/_Private/socket_connect_async.php` - socket_connect_async()関数実装

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | IPV6の値が6であること | E-01 (line 18: IPV6 = 6) | ○ |
| C-02 | IPV4の値が4であること | E-01 (line 19: IPV4 = 4) | ○ |
| C-03 | PREFER_IPV6の値が0であること | E-02 (line 18: PREFER_IPV6 = 0) | ○ |
| C-04 | FORCE_IPV6の値が6であること | E-02 (line 19: FORCE_IPV6 = 6) | ○ |
| C-05 | FORCE_IPV4の値が4であること | E-02 (line 20: FORCE_IPV4 = 4) | ○ |
| C-06 | SO_REUSEADDRがtrueに設定できること | E-03 (line 14: ?'SO_REUSEADDR' => bool) | ○ |
| C-07 | SO_REUSEADDRがfalseに設定できること | E-03 (line 14: ?'SO_REUSEADDR' => bool) | ○ |
| C-08 | SO_REUSEADDRが省略可能であること | E-03 (line 14: ?'SO_REUSEADDR' - optional field) | ○ |
| C-09 | ローカルアドレスが取得できること | E-04 (line 37: getLocalAddress(): this::TAddress) | ○ |
| C-10 | ピアアドレスが取得できること | E-04 (line 39: getPeerAddress(): this::TAddress) | ○ |
| C-11 | 未接続状態でローカルアドレス取得時の挙動 | E-04 (interface定義、実装依存) | ○ |
| C-12 | 未接続状態でピアアドレス取得時の挙動 | E-04 (interface定義、実装依存) | ○ |
| C-13 | 次の接続を取得できること | E-05 (line 30: nextConnectionAsync(): Awaitable<TSock>) | ○ |
| C-14 | 接続待ちがない場合に待機すること | E-05 (line 26-30: ドキュメントコメント「Will wait for new connections」) | ○ |
| C-15 | リスニングアドレスが取得できること | E-05 (line 33: getLocalAddress(): this::TAddress) | ○ |
| C-16 | リスニングを停止できること | E-05 (line 36: stopListening(): void) | ○ |
| C-17 | 既に停止済みの場合の挙動 | **根拠なし** - 実装詳細に依存 | △ |
| C-18 | 停止後に接続取得を試みた場合 | E-05 (interface定義から推測) | ○ |
| C-19 | ソケットをクローズできること | E-06 (extends IO\CloseableReadWriteHandle) | ○ |
| C-20 | 既にクローズ済みの場合の挙動 | **根拠なし** - 継承元実装に依存 | △ |
| C-21 | 接続を受け入れできること | E-07 (line 16-42: socket_accept_async関数) | ○ |
| C-22 | BlockingIOException発生時にポーリングして再試行 | E-07 (line 22-40: catch BlockingIOExceptionブロック) | ○ |
| C-23 | サーバーソケットがクローズされた場合 | E-07 (line 33-38: STREAM_AWAIT_CLOSED判定、ECONNABORTED) | ○ |
| C-24 | 無効なFileDescriptorが渡された場合 | E-07 (OS\accept呼び出しから推測) | ○ |
| C-25 | IPv4アドレスが正しく解決されること | E-08 (line 20-22: AF_INET case, gethostbyname呼び出し) | ○ |
| C-26 | 既にIPv4形式の場合はそのまま返却 | E-08 (line 21-22: gethostbynameの仕様) | ○ |
| C-27 | IPv6アドレスが正しく解決されること | E-08 (line 23-35: AF_INET6 case, dns_get_record呼び出し) | ○ |
| C-28 | 既にIPv6形式の場合はそのまま返却 | E-08 (line 24-26: filter_varでIPv6チェック) | ○ |
| C-29 | 存在しないホスト名の場合（IPv4） | E-08 (gethostbynameの仕様 - 元のホスト名を返す) | ○ |
| C-30 | 存在しないホスト名の場合（IPv6） | E-08 (line 34-35: null返却) | ○ |
| C-31 | サポートされていないAddressFamilyの場合 | E-08 (line 36-40: default case, EAFNOSUPPORT) | ○ |
| C-32 | 空文字列が渡された場合（IPv4） | E-08 (gethostbyname呼び出しから推測) | ○ |
| C-33 | 空文字列が渡された場合（IPv6） | E-08 (filter_var, dns_get_recordから推測) | ○ |
| C-34 | ソケットが正常に作成・バインド・リッスンできること | E-09 (line 17-51: 関数全体) | ○ |
| C-35 | SO_REUSEADDRオプションが適用されること | E-09 (line 27-31: SO_REUSEADDR設定処理) | ○ |
| C-36 | SO_REUSEADDRオプションなしで作成できること | E-09 (line 27: ?? falseチェック) | ○ |
| C-37 | 非ブロッキングモードが設定されること | E-09 (line 32-33: F_GETFL/F_SETFL, O_NONBLOCK) | ○ |
| C-38 | bind()失敗時にエラーがスローされること | E-09 (line 35-46: try-catch, throw_errno) | ○ |
| C-39 | BlockingIOException発生時にポーリング | E-09 (line 37-45: catch BlockingIOExceptionブロック) | ○ |
| C-40 | backlogが0の場合 | E-09 (listen呼び出し - 実装依存) | ○ |
| C-41 | backlogが負の値の場合 | **根拠なし** - OS/HHVMの実装依存 | △ |
| C-42 | ソケット接続が正常に完了すること | E-10 (line 23-55: socket_connect_async関数) | ○ |
| C-43 | 非ブロッキングモードが設定されること | E-10 (line 28-29: F_GETFL/F_SETFL, O_NONBLOCK) | ○ |
| C-44 | BlockingIOException発生時にポーリング | E-10 (line 32-53: catch BlockingIOExceptionブロック) | ○ |
| C-45 | 接続先が存在しない場合 | E-10 (line 47-52: SO_ERROR取得、throw_errno) | ○ |
| C-46 | 接続がタイムアウトした場合 | E-10 (line 43-44: STREAM_AWAIT_TIMEOUT, ETIMEDOUT) | ○ |
| C-47 | ソケットがクローズされた場合 | E-10 (line 40-42: STREAM_AWAIT_CLOSED, ECONNRESET) | ○ |
| C-48 | 接続エラーが発生した場合（SO_ERROR） | E-10 (line 47-52: getsockopt_int, throw_errno) | ○ |
| C-49 | timeout_nsが0の場合 | E-10 (poll_async呼び出し - 実装依存) | ○ |
| C-50 | timeout_nsが負の値の場合 | E-10 (poll_async呼び出し - 実装依存) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-17**: Server.stopListening()のべき等性については、Serverインターフェースの実装クラス（TCP\Server, Unix\Server）を確認する必要がある
  - 候補: `src/tcp/Server.php` / `src/unix/Server.php`
- **C-20**: CloseableSocket.close()のべき等性については、IO\CloseableReadWriteHandleの実装を確認する必要がある
  - 候補: `src/io/` 配下の実装ファイル
- **C-41**: backlogに負の値を渡した場合の動作はOS/HHVMの実装に依存する
  - 候補: HHVMドキュメント / POSIXドキュメント

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - enum/type定義のテストケース（C-01〜C-08）は単純な値の確認のため
- 1: 中リスク - インターフェースメソッドのテストケース（C-09〜C-20）は実装クラスでのテストが必要
- 1: 中リスク - _Private関数のテストケース（C-21〜C-50）は内部実装だが重要なネットワーク処理を含む
- 2: 高リスク - タイムアウト・エラーハンドリング関連（C-23, C-45〜C-48）は本番環境での信頼性に直結

## 6) レビュアーチェックリスト（最小）
- [ ] enum値（IPProtocolVersion, IPProtocolBehavior）が仕様と一致しているか確認
- [ ] SocketOptions型のオプショナルフィールドの扱いが適切か確認
- [ ] Socket/Serverインターフェースの実装クラス（TCP, Unix）でのテスト方針を確認
- [ ] _Private関数のエラーハンドリングパスが網羅されているか確認
- [ ] タイムアウト値の境界条件（0, 負値）の期待動作を仕様と照合
- [ ] BlockingIOException発生時の非同期処理フローが正しいか確認
- [ ] ECONNABORTED, ECONNRESET, ETIMEDOUTの各エラーケースの網羅性を確認
