---
generated_at: 2026-01-29 10:30:00
metrics:
  claims_total: 168
  claims_with_evidence: 168
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：enterprise-models-captain.csv

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：168 / 168、根拠なし：0
- 優先レビュー（高）
  1. **UT-CPT-042**：ベクトル検索のテストは外部依存（EmbeddingService）があり、モック設計が必要
  2. **UT-CPT-080**：プラン制限テストはaccount.usage_limitsの実装に依存
  3. **UT-CPT-143**：動的クラス生成のテストは複雑なため実装確認が必要

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

- E-01: `enterprise/app/models/captain/assistant.rb` - Captain::Assistantモデル定義
- E-02: `enterprise/app/models/captain/assistant_response.rb` - Captain::AssistantResponseモデル定義
- E-03: `enterprise/app/models/captain/document.rb` - Captain::Documentモデル定義
- E-04: `enterprise/app/models/captain/scenario.rb` - Captain::Scenarioモデル定義
- E-05: `enterprise/app/models/captain/custom_tool.rb` - Captain::CustomToolモデル定義
- E-06: `enterprise/app/models/concerns/toolable.rb` - Concerns::Toolableモジュール定義
- E-07: `enterprise/app/models/concerns/safe_endpoint_validatable.rb` - Concerns::SafeEndpointValidatableモジュール定義
- E-08: `enterprise/app/models/concerns/captain_tools_helpers.rb` - Concerns::CaptainToolsHelpersモジュール定義
- E-09: `enterprise/app/models/concerns/agentable.rb` - Concerns::Agentableモジュール定義

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

### Captain::Assistant (UT-CPT-001 〜 UT-CPT-029)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | belongs_to :accountリレーション | E-01 L26 | ○ |
| C-02 | has_many :documentsリレーション | E-01 L27 | ○ |
| C-03 | has_many :responsesリレーション | E-01 L28 | ○ |
| C-04 | has_many :captain_inboxesリレーション | E-01 L29-31 | ○ |
| C-05 | has_many :inboxes throughリレーション | E-01 L33-34 | ○ |
| C-06 | has_many :messages polymorphicリレーション | E-01 L35 | ○ |
| C-07 | has_many :copilot_threadsリレーション | E-01 L36 | ○ |
| C-08 | has_many :scenariosリレーション | E-01 L37 | ○ |
| C-09 | validates :name presence | E-01 L41 | ○ |
| C-10 | validates :description presence | E-01 L42 | ○ |
| C-11 | validates :account_id presence | E-01 L43 | ○ |
| C-12 | store_accessor :temperature | E-01 L39 | ○ |
| C-13 | store_accessor :feature_faq | E-01 L39 | ○ |
| C-14 | store_accessor :feature_memory | E-01 L39 | ○ |
| C-15 | store_accessor :product_name | E-01 L39 | ○ |
| C-16 | scope :ordered | E-01 L45 | ○ |
| C-17 | scope :for_account | E-01 L47 | ○ |
| C-18 | available_nameメソッド | E-01 L49-51 | ○ |
| C-19 | available_agent_toolsメソッド | E-01 L53-60 | ○ |
| C-20 | available_agent_tools境界値 | E-01 L53-60 | ○ |
| C-21 | available_tool_idsメソッド | E-01 L62-64 | ○ |
| C-22 | push_event_dataメソッド | E-01 L66-75 | ○ |
| C-23 | push_event_data境界値 | E-01 L70, L118-120 | ○ |
| C-24 | webhook_dataメソッド | E-01 L77-86 | ○ |
| C-25 | agent_nameメソッド | E-01 L90-92 | ○ |
| C-26 | agent_toolsメソッド | E-01 L94-99 | ○ |
| C-27 | prompt_contextメソッド | E-01 L101-116 | ○ |
| C-28 | prompt_context境界値 | E-01 L105 | ○ |
| C-29 | default_avatar_urlメソッド | E-01 L118-120 | ○ |

### Captain::AssistantResponse (UT-CPT-030 〜 UT-CPT-047)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 | belongs_to :assistantリレーション | E-02 L28 | ○ |
| C-31 | belongs_to :accountリレーション | E-02 L29 | ○ |
| C-32 | belongs_to :documentable polymorphic | E-02 L30 | ○ |
| C-33 | documentable optional | E-02 L30 | ○ |
| C-34 | has_neighbors :embedding | E-02 L31 | ○ |
| C-35 | validates :question presence | E-02 L33 | ○ |
| C-36 | validates :answer presence | E-02 L34 | ○ |
| C-37 | scope :ordered | E-02 L40 | ○ |
| C-38 | scope :by_account | E-02 L41 | ○ |
| C-39 | scope :by_assistant | E-02 L42 | ○ |
| C-40 | enum status pending | E-02 L45 | ○ |
| C-41 | enum status approved | E-02 L45 | ○ |
| C-42 | self.searchメソッド | E-02 L47-50 | ○ |
| C-43 | ensure_statusコールバック | E-02 L54-56 | ○ |
| C-44 | ensure_accountコールバック | E-02 L58-60 | ○ |
| C-45 | update_response_embedding question | E-02 L62-66 | ○ |
| C-46 | update_response_embedding answer | E-02 L62-66 | ○ |
| C-47 | update_response_embedding 境界値 | E-02 L63 | ○ |

### Captain::Document (UT-CPT-048 〜 UT-CPT-091)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-48 | belongs_to :assistantリレーション | E-03 L27 | ○ |
| C-49 | has_many :responsesリレーション | E-03 L28 | ○ |
| C-50 | belongs_to :accountリレーション | E-03 L29 | ○ |
| C-51 | has_one_attached :pdf_file | E-03 L30 | ○ |
| C-52 | validates :external_link presence条件付き | E-03 L32 | ○ |
| C-53 | validates :external_link pdf_file時 | E-03 L32 | ○ |
| C-54 | validates :external_link uniqueness | E-03 L33 | ○ |
| C-55 | validates :content length max | E-03 L34 | ○ |
| C-56 | validates :content length境界値 | E-03 L34 | ○ |
| C-57 | validates :pdf_file presence条件付き | E-03 L35 | ○ |
| C-58 | validate_pdf_format | E-03 L125-129 | ○ |
| C-59 | validate_file_attachment サイズ | E-03 L131-137 | ○ |
| C-60 | validate_file_attachment サイズ境界値 | E-03 L134 | ○ |
| C-61 | enum status in_progress | E-03 L42-45 | ○ |
| C-62 | enum status available | E-03 L42-45 | ○ |
| C-63 | scope :ordered | E-03 L52 | ○ |
| C-64 | scope :for_account | E-03 L54 | ○ |
| C-65 | scope :for_assistant | E-03 L55 | ○ |
| C-66 | pdf_document? PDFアタッチ | E-03 L57-61 | ○ |
| C-67 | pdf_document? .pdf拡張子 | E-03 L60 | ○ |
| C-68 | pdf_document? 非PDF | E-03 L57-61 | ○ |
| C-69 | content_type | E-03 L63-65 | ○ |
| C-70 | content_type nil | E-03 L64 | ○ |
| C-71 | file_size | E-03 L67-69 | ○ |
| C-72 | file_size nil | E-03 L68 | ○ |
| C-73 | openai_file_id | E-03 L71-73 | ○ |
| C-74 | openai_file_id nil | E-03 L72 | ○ |
| C-75 | store_openai_file_id | E-03 L75-77 | ○ |
| C-76 | store_openai_file_id マージ | E-03 L76 | ○ |
| C-77 | display_url external_link | E-03 L79-87 | ○ |
| C-78 | display_url PDF blob | E-03 L82-84 | ○ |
| C-79 | ensure_account_id | E-03 L116-118 | ○ |
| C-80 | ensure_within_plan_limit | E-03 L120-123 | ○ |
| C-81 | set_external_link_for_pdf | E-03 L139-146 | ○ |
| C-82 | normalize_external_link | E-03 L148-153 | ○ |
| C-83 | normalize_external_link PDF | E-03 L150 | ○ |
| C-84 | enqueue_crawl_job | E-03 L91-95 | ○ |
| C-85 | enqueue_crawl_job 境界値 | E-03 L92 | ○ |
| C-86 | enqueue_response_builder_job status変更 | E-03 L97-109 | ○ |
| C-87 | enqueue_response_builder_job content変更 | E-03 L109 | ○ |
| C-88 | enqueue_response_builder_job destroyed | E-03 L104 | ○ |
| C-89 | update_document_usage 作成時 | E-03 L49 | ○ |
| C-90 | update_document_usage 削除時 | E-03 L50 | ○ |
| C-91 | LimitExceededError | E-03 L24 | ○ |

### Captain::Scenario (UT-CPT-092 〜 UT-CPT-119)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-92 | belongs_to :assistantリレーション | E-04 L29 | ○ |
| C-93 | belongs_to :accountリレーション | E-04 L30 | ○ |
| C-94 | validates :title presence | E-04 L32 | ○ |
| C-95 | validates :description presence | E-04 L33 | ○ |
| C-96 | validates :instruction presence | E-04 L34 | ○ |
| C-97 | validates :assistant_id presence | E-04 L35 | ○ |
| C-98 | validates :account_id presence | E-04 L36 | ○ |
| C-99 | validate_instruction_tools 無効 | E-04 L105-117 | ○ |
| C-100 | validate_instruction_tools 有効 | E-04 L105-117 | ○ |
| C-101 | validate_instruction_tools 空 | E-04 L106 | ○ |
| C-102 | scope :enabled | E-04 L39 | ○ |
| C-103 | delegate :temperature | E-04 L41 | ○ |
| C-104 | delegate :feature_faq | E-04 L41 | ○ |
| C-105 | delegate :feature_memory | E-04 L41 | ○ |
| C-106 | delegate :product_name | E-04 L41 | ○ |
| C-107 | delegate :response_guidelines | E-04 L41 | ○ |
| C-108 | delegate :guardrails | E-04 L41 | ○ |
| C-109 | prompt_context | E-04 L45-54 | ○ |
| C-110 | prompt_context 境界値 | E-04 L51 | ○ |
| C-111 | agent_name | E-04 L58-60 | ○ |
| C-112 | agent_tools | E-04 L62-64 | ○ |
| C-113 | resolved_instructions | E-04 L66-68 | ○ |
| C-114 | resolved_tools | E-04 L70-77 | ○ |
| C-115 | resolved_tools 境界値 | E-04 L71 | ○ |
| C-116 | resolve_tool_instance custom | E-04 L79-89 | ○ |
| C-117 | resolve_tool_instance built-in | E-04 L79-89 | ○ |
| C-118 | resolve_tool_references | E-04 L133-138 | ○ |
| C-119 | resolve_tool_references 境界値 | E-04 L134 | ○ |

### Captain::CustomTool (UT-CPT-120 〜 UT-CPT-142)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-120 | belongs_to :accountリレーション | E-05 L49 | ○ |
| C-121 | enum :http_method GET | E-05 L51 | ○ |
| C-122 | enum :http_method POST | E-05 L51 | ○ |
| C-123 | enum :http_method 不正値 | E-05 L51 | ○ |
| C-124 | enum :auth_type none | E-05 L52 | ○ |
| C-125 | enum :auth_type bearer | E-05 L52 | ○ |
| C-126 | enum :auth_type basic | E-05 L52 | ○ |
| C-127 | enum :auth_type api_key | E-05 L52 | ○ |
| C-128 | validates :slug presence | E-05 L56 | ○ |
| C-129 | validates :slug uniqueness | E-05 L56 | ○ |
| C-130 | validates :title presence | E-05 L57 | ○ |
| C-131 | validates :endpoint_url presence | E-05 L58 | ○ |
| C-132 | JsonSchemaValidator 正常 | E-05 L59-61 | ○ |
| C-133 | JsonSchemaValidator 異常 | E-05 L59-61 | ○ |
| C-134 | scope :enabled | E-05 L63 | ○ |
| C-135 | to_tool_metadata | E-05 L65-72 | ○ |
| C-136 | generate_slug | E-05 L76-84 | ○ |
| C-137 | generate_slug 既存 | E-05 L77 | ○ |
| C-138 | generate_slug title空 | E-05 L78 | ○ |
| C-139 | find_unique_slug | E-05 L86-95 | ○ |
| C-140 | find_unique_slug 例外 | E-05 L94 | ○ |
| C-141 | slug_exists? true | E-05 L97-99 | ○ |
| C-142 | slug_exists? false | E-05 L97-99 | ○ |

### Concerns::Toolable (UT-CPT-143 〜 UT-CPT-159)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-143 | toolメソッド | E-06 L4-32 | ○ |
| C-144 | build_request_url テンプレート | E-06 L34-38 | ○ |
| C-145 | build_request_url そのまま | E-06 L35 | ○ |
| C-146 | build_request_body | E-06 L40-44 | ○ |
| C-147 | build_request_body nil | E-06 L41 | ○ |
| C-148 | build_auth_headers none | E-06 L46-61 | ○ |
| C-149 | build_auth_headers bearer | E-06 L50-52 | ○ |
| C-150 | build_auth_headers api_key header | E-06 L53-57 | ○ |
| C-151 | build_auth_headers api_key query | E-06 L53-57 | ○ |
| C-152 | build_basic_auth_credentials basic | E-06 L63-67 | ○ |
| C-153 | build_basic_auth_credentials non-basic | E-06 L64 | ○ |
| C-154 | build_metadata_headers | E-06 L69-75 | ○ |
| C-155 | add_conversation_headers | E-06 L83-86 | ○ |
| C-156 | add_contact_headers | E-06 L88-92 | ○ |
| C-157 | format_response テンプレート | E-06 L94-99 | ○ |
| C-158 | format_response そのまま | E-06 L95 | ○ |
| C-159 | render_template 例外 | E-06 L103-109 | ○ |

### Concerns::SafeEndpointValidatable (UT-CPT-160 〜 UT-CPT-168)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-160 | validate_safe_endpoint_url HTTPS正常 | E-07 L13-23 | ○ |
| C-161 | validate_safe_endpoint_url HTTP | E-07 L34-38 | ○ |
| C-162 | validate_safe_endpoint_url localhost | E-07 L40-63 | ○ |
| C-163 | validate_safe_endpoint_url IP | E-07 L65-76 | ○ |
| C-164 | validate_safe_endpoint_url FRONTEND_URL | E-07 L46-48 | ○ |
| C-165 | validate_safe_endpoint_url .local | E-07 L5, L51-62 | ○ |
| C-166 | validate_safe_endpoint_url 非ASCII | E-07 L78-83 | ○ |
| C-167 | parse_endpoint_uri Liquid除去 | E-07 L25-32 | ○ |
| C-168 | parse_endpoint_uri 無効URI | E-07 L30-31 | ○ |

## 4) 不足情報（Unknown / Missing）
- なし

すべてのテストケースは、対応するソースコードファイルに根拠が存在することを確認しました。

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - ほとんどのテストケースは単純なリレーション、バリデーション、スコープのテスト
- **1: 中リスク**
  - UT-CPT-042: ベクトル検索（EmbeddingService外部依存）
  - UT-CPT-080: プラン制限チェック（account.usage_limitsの実装依存）
  - UT-CPT-143: 動的クラス生成（実行時のメタプログラミング）
- **0: 低リスク** - Concernsのテストは対象クラスを通じてテスト可能

## 6) レビュアーチェックリスト（最小）
- [ ] Captain::Assistantのリレーションが正しくテスト対象になっているか確認
- [ ] Captain::Documentのファイルサイズ制限（10MB）のテストが適切か確認
- [ ] Captain::CustomToolのセキュリティバリデーション（SSRF対策）が網羅されているか確認
- [ ] enum値のテストで有効値/無効値の両方がカバーされているか確認
- [ ] before_validation/after_commitコールバックのテスト設計が適切か確認
- [ ] ベクトル検索（EmbeddingService）のモック戦略を検討
- [ ] Liquid テンプレートエラーの例外テストが十分か確認
