型付き辺: 出 12 / 入 1
ADR-0071: Gate 1 Socratic Node を盲点検出エンジンに再定義
- 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.tsDA ノードに実装 (PR #1091)。CONSTITUTION_PERSPECTIVES22 観点から毎回 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 が既に集めた情報の外側にあるリスク」は誰も検出していない。具体的には:
- RQ の 3 モデル合意が同じ訓練データバイアスで盲点を共有するリスク
- 起案者=審査者のソロ運用で confirmation bias が構造的に排除できないリスク
- 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.jsonのselected_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。
影響を受けるファイル / モジュール:
drp/src/nodes/socratic.ts— 既存インタラクティブ Socratic を 3 本並列 DAG (DA+PM+Judge) に置換drp/src/graph.ts—buildPreGraph()/buildGraph()の socratic node 呼出しを新 DAG に差替えdrp/src/do/socratic_session.ts— インタラクティブセッション管理を廃止drp/src/index.ts—/chat/answerエンドポイントの Socratic 質問回答フローを deprecateprompts/production/gate1-socratic/prompt.md— DA / PM / Judge 用の 3 プロンプトに分割 (またはgate1-da/,gate1-pm/,gate1-judge/に分離)prompts/production/gate1-socratic/prompt.meta.yaml—llm_paramsを DA (T=0.95) / PM (T=0.8) / Judge (T=0.2) に分離prompts/production/gate1-socratic/constitution.yaml— 新規: DA がランダム 3 観点を選択する Constitution 観点リストdrp/src/state.ts—socraticQuestions→blindSpotFindingsに state フィールド変更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.0 | 5 | 3 | 0 | 1 |
| #reliable | ×2.0 | 4 | 2 | 5 | 5 |
| #efficient | ×1.0 | 3 | 5 | 5 | 4 |
| #maintainable | ×1.0 | 4 | 2 | 5 | 3 |
| #operable | ×0.5 | 4 | 4 | 5 | 5 |
| 加重和 (正規化) | 0.806 | 0.594 | 0.694 | 0.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.jsonのerrorsフィールドに記録 - 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 側に配置するのが自然:
- Gate 3/4 が post-gen critique を既に担当 → pre-gen + post-gen の 2 段構えが自然に成立
- Gemini の "generative ceiling" 指摘 — post-gen では生成物の説得力に引きずられ、書かれていない概念の検出が構造的に困難
- 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.mjs で prompts/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