• Status: Accepted
  • Mode: Standard
  • Scope: platform
  • Kruchten Type: Existence/Property
  • Implementation Status: Done (PR #1042, #1091)
  • Notes: 2026-05-28 — Phase 1 補完として Constitution YAML からのランダム 3 観点選択を socratic.ts DA ノードに実装 (PR #1091)。CONSTITUTION_PERSPECTIVES 22 観点から毎回 3 観点をランダム選択し、選択結果は constitution_perspectives_selected イベントとしてログ記録 (再現性確保)。loadPrompt で取得した DA プロンプトに [Constitution] セクションを append
  • 起案者: [email protected]
  • 起案日時 (JST): 2026-05-27 01:18
  • 承認日時 (JST): 2026-05-27 (PR #1042)
  • Deciders: [email protected] (単独)

コンテキスト

1.1 背景 (Background)

2026-05-26 の運用レビューで、Decision Pipeline (ADR-0019) の Gate 1 Socratic Node が「追加質問 0 件」で素通りしている実態を確認した。3 モデル並列 RQ → Synthesis → 草案起草の上流プロセスが情報密度を十分に高めているため、「情報不足を補う追加質問」という Gate 1 の設計前提が成立しなくなっている。

1.2 現状 (Current State / As-Is)

Gate 1 Socratic は「ADR 草案に不足している情報を追加質問で補完する」インタラクティブノード。実運用では RQ Synthesis が 3 モデルコンセンサスを提供しているため、Gate 1 は毎回 pass=true (追加質問 0 件) で素通り。Pipeline の計算リソースを消費するだけの dead node 化している。

1.3 課題 (Problem)

Gate 1 の死活化は設計の失敗ではなく上流プロセス成功の副作用 (RQ-059 調査で 3 vendor 一致) である。しかし「Proposer が既に集めた情報の外側にあるリスク」は誰も検出していない。具体的には:

  1. RQ の 3 モデル合意が同じ訓練データバイアスで盲点を共有するリスク
  2. 起案者=審査者のソロ運用で confirmation bias が構造的に排除できないリスク
  3. RQ の調査範囲外にある隣接ドメインの失敗事例を見落とすリスク

1.4 制約・要件 (Constraints & Requirements)

  • インタラクティブ構造不要 (ワンショット)
  • Pipeline 総時間に大きな影響を与えない (async 実行可、ADR-0066 準拠)
  • 1 人法人運用で月次 < 0.5h の運用負荷
  • ADR-0056 の temperature/sampling 戦略と整合
  • Proposer と異なるモデルファミリで実行

1.5 目標 (Goals / To-Be)

Gate 1 を「盲点検出エンジン」に再定義し、Devil's Advocate / Pre-mortem / Adjacent Domain の 3 本並列ノード + Judge/Aggregator の non-interactive DAG として再構築する。Non-Goals: Gate 1 の廃止、Gate 2-4 の変更、RQ プロセス自体の変更。

決定

Gate 1 Socratic Node をインタラクティブ追加質問ノードから「盲点検出エンジン」に再定義し、Devil's Advocate (DA, T=0.95) / Pre-mortem (PM, T=0.8) / Adjacent Domain (AD, T=0.85, Phase 2) の 3 本並列ノード + Judge/Aggregator (T=0.2) からなる non-interactive DAG として再構築する。Phase 1 は DA + PM + Judge のみ実装し、AD は Phase 2 で web search 連携と共に追加する。Judge の分類はアドバイザリであり、Pipeline の pass/fail 判定には使用せず、PR body の Blind-spot Report に全 findings を severity 付きで表示して人間が最終判断する。

DAG 構成詳細:

  • Devil's Advocate (DA, T=0.95): RQ Synthesis の結論に対する反論を 3-5 個生成。敵対的役割を明示指定 (Silverio/Smit TMLR 2026)。Constitution YAML からランダム 3 観点を選択(選択された観点は socratic_report.jsonselected_perspectives に記録し再現性を確保)
  • Pre-mortem (PM, T=0.8): 「6 ヶ月後にこの ADR を採用した結果、システムは破滅的に失敗した」シナリオを 4 カテゴリ (技術/運用/ビジネス・規制/認知) 強制で生成。FMEA 風 severity × probability × impact スコアリング
  • Adjacent Domain (AD, T=0.85): ADR の core decision を抽象化 → 3 つの異ドメインで類似決定の失敗・成功事例を web search → bizlp への mapping。Phase 2 で追加
  • Judge/Aggregator (T=0.2): 3 ノードの出力を dedupe_group で統合、severity (critical/high/medium/low) × actionability (block/revise_adr/add_to_risks/monitor) で分類。ADR の Risks/Alternatives で既出のものは除外

出力スキーマ: findings 配列 (source, title, severity, actionability, evidence, suggested_action, dedupe_group) + total_count_by_severity + self_assessment

影響を受けるファイル / モジュール:

  1. drp/src/nodes/socratic.ts — 既存インタラクティブ Socratic を 3 本並列 DAG (DA+PM+Judge) に置換
  2. drp/src/graph.tsbuildPreGraph() / buildGraph() の socratic node 呼出しを新 DAG に差替え
  3. drp/src/do/socratic_session.ts — インタラクティブセッション管理を廃止
  4. drp/src/index.ts/chat/answer エンドポイントの Socratic 質問回答フローを deprecate
  5. prompts/production/gate1-socratic/prompt.md — DA / PM / Judge 用の 3 プロンプトに分割 (または gate1-da/, gate1-pm/, gate1-judge/ に分離)
  6. prompts/production/gate1-socratic/prompt.meta.yamlllm_params を DA (T=0.95) / PM (T=0.8) / Judge (T=0.2) に分離
  7. prompts/production/gate1-socratic/constitution.yaml — 新規: DA がランダム 3 観点を選択する Constitution 観点リスト
  8. drp/src/state.tssocraticQuestionsblindSpotFindings に state フィールド変更
  9. drp/public/chat.html — Socratic 質問回答 UI を盲点レポート表示 UI に変更

判断基準 (Decision Drivers)

3.1 評価軸

#重要度 (係数)案件特有の解釈
1#suitable[Must] (×2.0)Proposer=Reviewer の構造的バイアス・RQ 3 モデル共有盲点を機械的に検出できること (Gate 1 の本来目的)
2#reliable[Must] (×2.0)false positive がワークフローを阻害しない / 部分結果で継続できること
3#efficient[High] (×1.0)LLM コスト増 < $2/月 (月 15 ADR 想定) かつ Pipeline 実行時間増 < +90 秒
4#maintainable[High] (×1.0)プロンプト分割・Constitution YAML 化により観点追加が低コスト
5#operable[Medium] (×0.5)月次運用負荷 < 0.5h を満たすこと (1 人法人運用前提)

K.O. criterion: Must 軸 (#suitable / #reliable) の score < 3 は不採用。

3.2 評価軸 × 案スコア表

係数採択案 (3 並列 DAG)案 B (統合ワンショット)案 C (Gate 1 廃止)案 D (現状維持)
#suitable×2.05301
#reliable×2.04255
#efficient×1.03554
#maintainable×1.04253
#operable×0.54455
加重和 (正規化)0.8060.5940.6940.625
K.O. 通過 (Must ≥3)❌ (#reliable=2)❌ (#suitable=0)❌ (#suitable=1)

検討した代替案 (Alternatives Considered)

  • 案 B: 統合ワンショット — 1 call で DA+PM+AD を統合。コスト最小だが、1 プロンプトに詰め込むと各手法の最適 temperature が異なり品質が低下。severity 分類精度も低下 (Gemini 調査: S/N 比低下)。不採用理由: #reliable K.O. 不通過 (品質低下)。
  • 案 C: Gate 1 廃止 — Pipeline 簡素化・コスト削減。不採用理由: Proposer=Reviewer の構造的バイアスリスクが完全に放置される (#suitable K.O. 不通過)。
  • 案 D: 現状維持 (インタラクティブ Socratic 継続) — 変更コストゼロ。不採用理由: 毎回 pass=true で素通りの dead node を維持し続ける意味がなく、計算リソースの浪費が継続。将来のバイアスリスク対策も先送り (#suitable K.O. 不通過)。

影響 (Consequences)

5.1 正の影響 (Good)

  • Proposer=Reviewer の構造的バイアスリスクを機械的に検出できる
  • RQ の 3 モデル合意の盲点を異なるモデルファミリで攻撃できる
  • 非対話型のため Pipeline 実行時間に human-in-the-loop の待ち時間が不要
  • プロンプト分離・Constitution YAML 化により観点の追加・調整が低コスト

5.2 負の影響 (Bad)

  • LLM コストが 1 ADR あたり $0.10-0.30 増加 (月 5 ADR で $0.50、月 15 ADR で $1.50)
  • false positive がワークフローを阻害するリスク (severity 分類とアラート疲労)
  • Devil's Advocate の 4.9% inauthentic dissent (Silverio/Smit) — Judge の dedupe で軽減するが完全排除は不可
  • Pipeline 実行時間が +30-90 秒/ADR 増加 (async)

5.3 中立・トレードオフ (Neutral / Trade-offs)

エラーハンドリング:

  • Judge 誤分類時: PR body の Blind-spot Report に全 findings を severity 付きで表示し人間が最終判断。Judge の分類はアドバイザリであり Pipeline の pass/fail 判定には使用しない
  • 3 ノード片落ち (API エラー): 成功したノードの結果のみを Judge に渡す (部分結果で継続)。全 3 ノード失敗時のみ Gate 1 を skip-through。エラーは socratic_report.jsonerrors フィールドに記録
  • dedupe_group キー衝突: Judge が文字列類似度 (Jaccard ≥ 0.7) で統合し source を配列化。完全重複は高い方の severity を採用

コスト試算:

  • LLM 運用コスト: 1 ADR あたり DA ($0.03) + PM ($0.03) + Judge ($0.04) ≈ $0.10/ADR。月 5 ADR で $0.50/月、月 15 ADR (Jr 入社後) で $1.50/月
  • Pipeline 実行時間増 +30-90 秒/ADR (async)

初期実装工数 (Phase 1 合計 4.5 人日 / Phase 2 追加 2.0 人日):

  • socratic.ts を 3 本並列 DAG + Judge に再構築: 1.5 人日
  • DA / PM / Judge 用プロンプト 3 本作成: 1.0 人日
  • constitution.yaml 初期観点リスト作成 (20-30 観点): 0.5 人日
  • graph.ts / state.ts / index.ts 改修: 0.5 人日
  • chat.html 盲点レポート表示 UI: 0.5 人日
  • 出力スキーマ (output_schema.json) + テスト: 0.5 人日
  • Phase 2 追加 (AD ノード + web search 連携): 2.0 人日 (別途)。Phase 2 の AD ノード web search コスト(Tavily 等)は本 ADR の $2/月制約とは別枠とし、Phase 2 実装 ADR で個別にコスト試算・制約を定義する

Amendment: Gate 配置位置と body feed-in (RQ-059b)

追記日: 2026-05-27 根拠: RQ-059b — 3 モデル Deep Research 調査 (Claude/Gemini/OpenAI)

配置位置の決定

Gate 1 盲点検出を pre-generation (body 生成前) に配置し、findings を body_generation の入力に feed-in する。

RQ-059b で 3 モデルに配置位置 (pre-gen vs post-gen) を調査した結果、表面上は Claude=post-gen / Gemini=pre-gen / OpenAI=hybrid と分かれたが、各モデルの Decision Matrix を精査すると 3 者とも hybrid (pre+post) が最高評価で収束していた:

  • Claude: post-gen 推奨だが "lightweight pre-generation concern-seeding pass" を明記、Decision Matrix で Hybrid が最高点 (66 vs 60)
  • Gemini: pre-gen 推奨だが Multi-Stage を「Low FP / High Accuracy」と最高評価
  • OpenAI: 最初から hybrid 推奨

bizlp Pipeline への適用

bizlp の Pipeline には Gate 3 (Parallel Review) と Gate 4 (Scoring) が body 生成後に既存する。これらが post-gen critique の役割を担うため、Gate 1 は pre-gen 側に配置するのが自然:

  1. Gate 3/4 が post-gen critique を既に担当 → pre-gen + post-gen の 2 段構えが自然に成立
  2. Gemini の "generative ceiling" 指摘 — post-gen では生成物の説得力に引きずられ、書かれていない概念の検出が構造的に困難
  3. Pre-gen findings → body feed-in → Gate 3/4 post-gen review のフローが最も効率的 (body を 1 回だけ生成すれば済む)

body feed-in の設計

盲点検出の findings を body_generation ノードの入力に注入し、ADR 草案が findings の指摘事項を考慮した内容で生成されるようにする。これにより post-gen での revision loop が不要になり、Pipeline 実行時間とコストを抑制できる。

撤退条件 (Rollback Plan)

  • Sunset 基準 (3 ヶ月運用後): findings accepted 率 (人間が有用と判断し ADR に反映した findings の割合) < 20% OR ADR revision rate < 10% OR 月所要時間 > 0.5h のいずれかを満たした場合
  • 判定タイミング: 2026-08 目処
  • 撤退手順: Socratic Node を元のインタラクティブ Socratic に戻す or Gate 1 を skip-through に設定

Confirmation (準拠確認 / Fitness Function)

要素内容
検証手段(1) Phase 1 完了条件 5 項目を統合テストで自動検証: ①サンプル ADR (ADR-0056 等) を入力し finding ≥ 3 件生成、②Judge の severity/actionability 分類妥当性を手動検証で 80% 以上、③1 ノード API エラー注入時に残り 2 ノードで Gate 1 正常完了、④socratic_report.json が出力スキーマに準拠、⑤Pipeline 総実行時間増 ≤ +90 秒。(2) scripts/adr-lint.mjsprompts/production/gate1-* のプロンプト構造と prompt.meta.yaml の temperature 設定 (DA=0.95 / PM=0.8 / Judge=0.2) を静的検証。(3) Pipeline Gate 2 で socratic_report.json の生成有無を必須化。
実行頻度統合テスト: PR ごと (CI)。Pipeline Gate 2 検証: ADR 起案ごと。月次レビュー: 月初に accepted 率・revision rate・所要時間を集計 (撤退条件と連動)。
違反時の対応CI 失敗時は PR マージブロック。Pipeline 実行で全 3 ノード失敗が継続する場合は skip-through に自動 fallback し warning ログ。月次集計で Sunset 基準抵触時は §「撤退条件」に従い元のインタラクティブ Socratic に戻す or skip-through 化。

参照 (References)

  • 関連 ADR: ADR-0019 (Decision Pipeline), ADR-0056 (temperature/sampling 戦略), ADR-0066 (async 実行)
  • 関連 PR/Issue: RQ-059 (3 モデル合意の盲点共有調査), RQ-059b (Gate 配置位置 pre-gen vs post-gen 調査 — 3 モデル統合結論)
  • 外部資料:
    • Silverio, Chezan, van Sprang, Cappendijk & Smit (TMLR 2026) — T4 Explicit Dissent Instructions (disagreement rate 99.2% vs baseline 48.3%)
    • Veinott, Klein & Wiggins (2010) — Pre-mortem の効果サイズ (Pros/Cons の約 2 倍、178 名 5 条件実験)
    • Wang et al. (2024) — Devil's Advocate: タスク成功率 +3.5pp、修正回数 45% 削減
    • Sovrano et al. (2025) — confirmation bias 高複雑度タスクで最大 49.1%
    • Du et al. (ICML 2024) — Multiagent Debate
    • Bai et al. (2022) — Constitutional AI