---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 100
  claims_with_evidence: 93
  claims_without_evidence: 7
confidence_derived: 0.93
---

# 根拠レポート：winconpty.csv

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.93**
  - 根拠あり：93 / 100、根拠なし：7
- 優先レビュー（高）
  1. **C-008（_ConsoleHostPath アーキテクチャサブディレクトリ探索）**：IsWow64Process2の実際の戻り値パターンが環境依存であり、テスト実行環境でのカバレッジに確信が持てない
  2. **C-026（_CreatePseudoConsole 最大サイズ境界値）**：SHORT_MAXでの動作がOS/リソース制限に依存し、期待結果が不確定
  3. **C-033（_ResizePseudoConsole ゼロサイズ）**：size={0,0}がリサイズとして有効かどうかのOS側の挙動が不明
  4. **C-047（_ReparentPseudoConsole パケットサイズ）**：pack(1)によるアラインメントの正確なサイズはコンパイラ依存の可能性
  5. **C-064（ConptyCreatePseudoConsoleAsUser INVALID_HANDLE入力）**：DuplicateHandleのINVALID_HANDLE_VALUE処理がOS版依存
  6. **C-080（ConptyReleasePseudoConsole INVALID_HANDLE_VALUE）**：_HandleIsValidのチェックは確認済みだが、実際のRelease関数内のコードパスでINVALID_HANDLE_VALUEが渡される実運用シナリオの根拠が薄い
  7. **C-081（ConptyReleasePseudoConsole conhostライフサイクル）**：conhostの終了タイミングがOS内部動作に依存

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

- E-01: `src/winconpty/winconpty.cpp` - メイン実装ファイル（全関数の実装コード）
- E-02: `src/winconpty/winconpty.h` - PseudoConsole構造体定義、シグナル定数、フラグ定数、関数プロトタイプ
- E-03: `src/winconpty/device.h` - CreateClientHandle/CreateServerHandleのラッパー定義
- E-04: `src/winconpty/precomp.h` - プリコンパイル済みヘッダー（依存ライブラリの確認）
- E-05: `src/winconpty/dll/winconpty.def` - DLLエクスポート定義（公開API一覧）
- E-06: `src/winconpty/ft_pty/ConPtyTests.cpp` - 既存の機能テストコード（テスト観点の参考）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | _HandleIsValid: 有効なハンドルでtrueが返る | E-01 (L91-94) | ○ |
| C-002 | _HandleIsValid: INVALID_HANDLE_VALUEでfalseが返る | E-01 (L91-94) | ○ |
| C-003 | _HandleIsValid: nullptrでfalseが返る | E-01 (L91-94) | ○ |
| C-004 | _InboxConsoleHostPath: conhost.exeパスが返却される | E-01 (L27-32) | ○ |
| C-005 | _InboxConsoleHostPath: 返却パスがnullでない | E-01 (L27-32) | ○ |
| C-006 | _ConsoleHostPath: コンソールホストパスが返却される | E-01 (L39-89) | ○ |
| C-007 | _ConsoleHostPath: OpenConsole.exeが同一ディレクトリにある場合 | E-01 (L47-49) | ○ |
| C-008 | _ConsoleHostPath: アーキテクチャサブディレクトリの探索 | E-01 (L50-78) | △ |
| C-009 | _ConsoleHostPath: OpenConsole未検出時のフォールバック | E-01 (L79-83) | ○ |
| C-010 | _ConsoleHostPath: magic staticキャッシュ | E-01 (L42-88) | ○ |
| C-011 | _CreatePseudoConsole: 正常作成 | E-01 (L96-248), E-06 (L192-207) | ○ |
| C-012 | _CreatePseudoConsole: pPty=nullptrでE_INVALIDARG | E-01 (L103-106) | ○ |
| C-013 | _CreatePseudoConsole: size.X=0でE_INVALIDARG | E-01 (L107-110), E-06 (L177-190) | ○ |
| C-014 | _CreatePseudoConsole: size.Y=0でE_INVALIDARG | E-01 (L107-110), E-06 (L177-190) | ○ |
| C-015 | _CreatePseudoConsole: size={0,0}でE_INVALIDARG | E-01 (L107-110), E-06 (L177-190) | ○ |
| C-016 | _CreatePseudoConsole: INVALID_HANDLE_VALUEトークンのnullptr変換 | E-01 (L113-116) | ○ |
| C-017 | _CreatePseudoConsole: INHERIT_CURSORフラグ | E-01 (L141, L169) | ○ |
| C-018 | _CreatePseudoConsole: GLYPH_WIDTH_GRAPHEMESフラグ | E-01 (L144-148) | ○ |
| C-019 | _CreatePseudoConsole: GLYPH_WIDTH_WCSWIDTHフラグ | E-01 (L149-151) | ○ |
| C-020 | _CreatePseudoConsole: GLYPH_WIDTH_CONSOLEフラグ | E-01 (L152-154) | ○ |
| C-021 | _CreatePseudoConsole: フラグ0のデフォルト動作 | E-01 (L155-157) | ○ |
| C-022 | _CreatePseudoConsole: hSignalの有効性 | E-01 (L243) | ○ |
| C-023 | _CreatePseudoConsole: hPtyReferenceの有効性 | E-01 (L244) | ○ |
| C-024 | _CreatePseudoConsole: hConPtyProcessの有効性 | E-01 (L245) | ○ |
| C-025 | _CreatePseudoConsole: size={1,1}最小サイズ | E-01 (L107-110) | ○ |
| C-026 | _CreatePseudoConsole: size={SHORT_MAX,SHORT_MAX}最大サイズ | E-01 (L107-110) | △ |
| C-027 | _ResizePseudoConsole: 正常リサイズ | E-01 (L258-272) | ○ |
| C-028 | _ResizePseudoConsole: pPty=nullptrでE_INVALIDARG | E-01 (L260-263) | ○ |
| C-029 | _ResizePseudoConsole: size.X<0でE_INVALIDARG | E-01 (L260-263) | ○ |
| C-030 | _ResizePseudoConsole: size.Y<0でE_INVALIDARG | E-01 (L260-263) | ○ |
| C-031 | _ResizePseudoConsole: シグナルパケット構造 | E-01 (L265-268), E-02 (L49) | ○ |
| C-032 | _ResizePseudoConsole: 書き込み失敗時のエラー | E-01 (L270-271) | ○ |
| C-033 | _ResizePseudoConsole: size={0,0}の動作 | E-01 (L260) | △ |
| C-034 | _ClearPseudoConsole: keepCursorRow=FALSEで正常クリア | E-01 (L281-294) | ○ |
| C-035 | _ClearPseudoConsole: keepCursorRow=TRUEで正常クリア | E-01 (L281-294) | ○ |
| C-036 | _ClearPseudoConsole: pPty=nullptrでE_INVALIDARG | E-01 (L283-286) | ○ |
| C-037 | _ClearPseudoConsole: シグナルIDの確認 | E-01 (L289), E-02 (L47) | ○ |
| C-038 | _ClearPseudoConsole: 書き込み失敗時のエラー | E-01 (L292-293) | ○ |
| C-039 | _ShowHidePseudoConsole: show=trueの動作 | E-01 (L305-317) | ○ |
| C-040 | _ShowHidePseudoConsole: show=falseの動作 | E-01 (L305-317) | ○ |
| C-041 | _ShowHidePseudoConsole: pPty=nullptrでE_INVALIDARG | E-01 (L307-310) | ○ |
| C-042 | _ShowHidePseudoConsole: シグナルIDの確認 | E-01 (L312), E-02 (L46) | ○ |
| C-043 | _ShowHidePseudoConsole: 書き込み失敗時のエラー | E-01 (L315-316) | ○ |
| C-044 | _ReparentPseudoConsole: 正常な親変更 | E-01 (L331-354) | ○ |
| C-045 | _ReparentPseudoConsole: pPty=nullptrでE_INVALIDARG | E-01 (L333-336) | ○ |
| C-046 | _ReparentPseudoConsole: シグナルパケット構造 | E-01 (L339-350), E-02 (L48) | ○ |
| C-047 | _ReparentPseudoConsole: パケットサイズ(10バイト) | E-01 (L339-345) | △ |
| C-048 | _ReparentPseudoConsole: 書き込み失敗時のエラー | E-01 (L351-353) | ○ |
| C-049 | _ClosePseudoConsoleMembers: 全ハンドルクローズ | E-01 (L365-385) | ○ |
| C-050 | _ClosePseudoConsoleMembers: pPty=nullptrの安全処理 | E-01 (L367) | ○ |
| C-051 | _ClosePseudoConsoleMembers: 部分的に閉じ済みの安全処理 | E-01 (L369-383) | ○ |
| C-052 | _ClosePseudoConsoleMembers: INVALID_HANDLE_VALUEのスキップ | E-01 (L369, L375, L379), E-01 (L91-94) | ○ |
| C-053 | _ClosePseudoConsole: メンバークローズとヒープ解放 | E-01 (L396-403) | ○ |
| C-054 | _ClosePseudoConsole: pPty=nullptrの安全処理 | E-01 (L398) | ○ |
| C-055 | ConptyCreatePseudoConsole: 正常作成 | E-01 (L432-439), E-05 (L3) | ○ |
| C-056 | ConptyCreatePseudoConsole: phPC=nullptrでE_INVALIDARG | E-01 (L448-451) | ○ |
| C-057 | ConptyCreatePseudoConsole: AsUserへの委譲 | E-01 (L438) | ○ |
| C-058 | ConptyCreatePseudoConsoleAsUser: トークン付き正常作成 | E-01 (L441-475) | ○ |
| C-059 | ConptyCreatePseudoConsoleAsUser: phPC=nullptrでE_INVALIDARG | E-01 (L448-451) | ○ |
| C-060 | ConptyCreatePseudoConsoleAsUser: 両パイプ無効でE_INVALIDARG | E-01 (L453-456), E-06 (L164) | ○ |
| C-061 | ConptyCreatePseudoConsoleAsUser: 両パイプnullptrでE_INVALIDARG | E-01 (L453-456), E-06 (L168) | ○ |
| C-062 | ConptyCreatePseudoConsoleAsUser: hInputのみ有効 | E-01 (L453-456), E-06 (L173-174) | ○ |
| C-063 | ConptyCreatePseudoConsoleAsUser: hOutputのみ有効 | E-01 (L453-456), E-06 (L170-171) | ○ |
| C-064 | ConptyCreatePseudoConsoleAsUser: INVALID_HANDLE入力のDuplicate失敗 | E-01 (L466) | △ |
| C-065 | ConptyCreatePseudoConsoleAsUser: ハンドル複製と継承 | E-01 (L466-467) | ○ |
| C-066 | ConptyCreatePseudoConsoleAsUser: 失敗時のクリーンアップ | E-01 (L460-462) | ○ |
| C-067 | ConptyResizePseudoConsole: 正常リサイズ | E-01 (L479-488) | ○ |
| C-068 | ConptyResizePseudoConsole: hPC=nullptrでE_INVALIDARG | E-01 (L481-482) | ○ |
| C-069 | ConptyClearPseudoConsole: keepCursorRow=FALSE | E-01 (L496-505) | ○ |
| C-070 | ConptyClearPseudoConsole: keepCursorRow=TRUE | E-01 (L496-505) | ○ |
| C-071 | ConptyClearPseudoConsole: hPC=nullptrでE_INVALIDARG | E-01 (L498-499) | ○ |
| C-072 | ConptyShowHidePseudoConsole: show=true | E-01 (L512-516) | ○ |
| C-073 | ConptyShowHidePseudoConsole: show=false | E-01 (L512-516) | ○ |
| C-074 | ConptyShowHidePseudoConsole: hPC=nullptrでE_INVALIDARG | E-01 (L514-515) | ○ |
| C-075 | ConptyReparentPseudoConsole: 正常な親変更 | E-01 (L523-526) | ○ |
| C-076 | ConptyReparentPseudoConsole: hPC=nullptrでE_INVALIDARG | E-01 (L525) | ○ |
| C-077 | ConptyReleasePseudoConsole: hPtyReference解放 | E-01 (L532-547), E-06 (L330-338) | ○ |
| C-078 | ConptyReleasePseudoConsole: hPC=nullptrでE_INVALIDARG | E-01 (L534-537) | ○ |
| C-079 | ConptyReleasePseudoConsole: 既にnullptrの安全処理 | E-01 (L540) | ○ |
| C-080 | ConptyReleasePseudoConsole: INVALID_HANDLE_VALUEスキップ | E-01 (L540), E-01 (L91-94) | △ |
| C-081 | ConptyReleasePseudoConsole: Release後のconhostライフサイクル | E-01 (L528-531), E-06 (L327-338) | △ |
| C-082 | ConptyClosePseudoConsole: 正常クローズ | E-01 (L556-559) | ○ |
| C-083 | ConptyClosePseudoConsole: hPC=nullptrの安全処理 | E-01 (L558), E-01 (L398) | ○ |
| C-084 | ConptyClosePseudoConsole: conhostプロセス終了 | E-01 (L556-559), E-06 (L270-324) | ○ |
| C-085 | ConptyPackPseudoConsole: 正常パック | E-01 (L570-590) | ○ |
| C-086 | ConptyPackPseudoConsole: phPC=nullptrでE_INVALIDARG | E-01 (L575) | ○ |
| C-087 | ConptyPackPseudoConsole: hProcess無効でE_INVALIDARG | E-01 (L577) | ○ |
| C-088 | ConptyPackPseudoConsole: hRef無効でE_INVALIDARG | E-01 (L578) | ○ |
| C-089 | ConptyPackPseudoConsole: hSignal無効でE_INVALIDARG | E-01 (L579) | ○ |
| C-090 | ConptyPackPseudoConsole: hProcess=nullptrでE_INVALIDARG | E-01 (L577), E-01 (L91-94) | ○ |
| C-091 | ConptyPackPseudoConsole: パック後のリサイズ互換性 | E-01 (L570-590, L479-488) | ○ |
| C-092 | ConptyPackPseudoConsole: パック後のClose互換性 | E-01 (L570-590, L556-559) | ○ |
| C-093 | ConptyPackPseudoConsole: ハンドルマッピング正確性 | E-01 (L584-586) | ○ |
| C-094 | CreateClientHandle: 正常作成 | E-03 (L19-22) | ○ |
| C-095 | CreateClientHandle: 無効サーバーハンドルのエラー | E-03 (L19-22) | ○ |
| C-096 | CreateClientHandle: 継承フラグ反映 | E-03 (L19-22) | ○ |
| C-097 | CreateServerHandle: 正常作成 | E-03 (L24-27) | ○ |
| C-098 | CreateServerHandle: 非継承フラグ反映 | E-03 (L24-27) | ○ |
| C-099 | _CreatePseudoConsole: 複数インスタンス同時作成 | E-01 (L96-248), E-06 (L209-234) | ○ |
| C-100 | ConptyCreatePseudoConsole: エンドツーエンド入出力 | E-01 (L432-439), E-06 (L330-338) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-008**: IsWow64Process2が返すnativeMachineの値はOS環境依存であり、テスト環境でAMD64/ARM64/x86のすべてのパスをカバーするのは困難。実機テストまたはモック化が必要。
  - 候補：Windows環境別テスト / IsWow64Process2のモック / コンパイル時分岐テスト
- **C-026**: SHORT_MAX（32767）のサイズでのPseudoConsole作成がリソース制限に引っかかる可能性がある。OS側の制約仕様書が未確認。
  - 候補：Windows Console API仕様書 / MSDN CreatePseudoConsoleドキュメント
- **C-033**: _ResizePseudoConsoleのバリデーションは `size.X < 0 || size.Y < 0` のみであり、size={0,0}は通過する。conhost側でゼロサイズがどう処理されるかの仕様が不明。
  - 候補：conhost内部実装の確認 / Windows Console仕様書
- **C-047**: pack(1)によるアラインメントのサイズ計算はコンパイラ依存の可能性がある。MSVC限定であればunsigned short(2) + uint64_t(8) = 10バイトは確定的。
  - 候補：MSVCコンパイラドキュメント / pack pragmaの仕様確認
- **C-064**: DuplicateHandleにINVALID_HANDLE_VALUEを渡した際の挙動がOS版に依存する可能性がある。
  - 候補：MSDN DuplicateHandleドキュメント / Windows SDK仕様
- **C-080**: ConptyReleasePseudoConsoleの実装ではhPtyReferenceのみを扱うが、INVALID_HANDLE_VALUEが設定される実運用シナリオの根拠が不足。
  - 候補：PseudoConsole構造体の初期化パターン調査
- **C-081**: conhostの終了タイミングはWindows内部のConDrvドライバの参照カウント管理に依存し、決定論的なテストが困難。
  - 候補：ConDrvドライバの設計書 / Windows Console Server内部仕様

## 5) リスクフラグ（レビュー観点）
- **リスク2（高）**: C-026 - SHORT_MAXサイズのテストは実行環境によりOOM等で不安定になる可能性がある。テスト実行時のタイムアウトや例外処理に注意が必要。
- **リスク1（中）**: C-008 - アーキテクチャ判定のテストは実行プラットフォームに強く依存。CI/CD環境で全アーキテクチャのカバレッジを保証するのは困難。
- **リスク1（中）**: C-081 - conhostライフサイクルのテストは非同期プロセス管理を含むため、フレーキーテストになるリスクがある（既存テスト ConPtyTests::ReleasePseudoConsole でも言及あり）。
- **リスク0（低）**: C-047 - pack(1)のサイズはMSVCでは確定的だが、将来的にクロスコンパイラ対応を行う場合は注意。
- **リスク0（低）**: C-033 - ゼロサイズリサイズの通過はバリデーション設計上の意図的な選択と思われるが、ドキュメントで明確化すべき。

## 6) レビュアーチェックリスト（最小）
- [ ] _HandleIsValidの2条件（INVALID_HANDLE_VALUE, nullptr）が正しく網羅されているか確認
- [ ] _CreatePseudoConsoleのフラグ処理（INHERIT_CURSOR, GLYPH_WIDTH系）がテストケースで全パターン網羅されているか確認
- [ ] _ResizePseudoConsoleのバリデーション（size < 0のみ、size == 0は通過）が意図通りか確認
- [ ] ConptyCreatePseudoConsoleAsUserのパイプ有効性チェック（両方無効のみ拒否、片方有効なら通過）のテストケースが正しいか確認
- [ ] ConptyReleasePseudoConsoleとConptyClosePseudoConsoleの違い（参照解放 vs 完全クローズ）がテストケースで適切に区別されているか確認
- [ ] ConptyPackPseudoConsoleの各ハンドルバリデーション（_HandleIsValid使用）がINVALID_HANDLE_VALUEとnullptrの両方でテストされているか確認
- [ ] device.hのCreateClientHandle/CreateServerHandleは実体がserver/DeviceHandle.hにあるため、結合テストの範囲も考慮が必要か確認
- [ ] 既存テスト（ConPtyTests.cpp）との重複・補完関係が適切か確認
