ADR-0150: socratic 由来の本文補強策を Cross-Validation の正当根拠と認め、承認を PR 終端レビューへ一本化する
- Status: Accepted (accepted-with-residual-risks — 末尾の HITL 残余リスク節参照。PR #1926 merge = 受理の規約により 2026-06-14 受理・代表取締役判断)
- Mode: Standard
- Kruchten Type: Executive/Property
- Scope: platform
- Implementation Status: In Progress (Phase a/b 本番デプロイ済 — PR #2032 CV ルール改修 / PR #2033 PR 補強一覧 + adr-reinforcement-checklist CI。Phase c = 正典 §G-1/§G-3・operator_guide §4.4 反映は本 PR。残 = adr-reinforcement-checklist の required check 登録〔branch protection・web UI 作業〕)
- 起案者: [email protected]
- 起案日時 (JST): 2026-06-13 00:58
- 承認日時 (JST): 2026-06-14 20:28
- Approver Role: platform
- Approver Who: [email protected]
- Driver: [email protected]
- Consulted: Decision Pipeline AI 審査 (Gate 0-4)
コンテキスト
§1.1 背景
Decision Pipeline は socratic (Gate 1) が検出した盲点を body_generation に注入し「Risks / Alternatives / 影響範囲セクションで必ず言及せよ」と指示する (drp/src/nodes/body_generation.ts の盲点検出レポート注入)。一方 Cross-Validation (CV) は生テキスト (Title/Context/Options) のみをアンカーとし、本文にだけ存在する補強策 (盲点が指摘したリスクへの対策。CV プロンプトの用語では mitigation = リスクの緩和。撤退条件の厳格化や監視の追加など、決定そのものはむしろ厳しくなる方向が多い) を BODY-ONLY MITIGATION CHECK で割り引く。この 2 つの設計が衝突し、「パイプライン自身の盲点指摘を本文生成が設計どおり織り込んだのに、CV がそれを根拠なしとして差し戻す」自己却下が起きている。
問題の本質を人間のレビューに例えると: これらの補強は審査 (socratic) が正しく機能して生まれた「レビュアー指摘を反映した修正」であり、妥当性も CV 自身が判定済みである。欠けているのは修正の正しさではなく、著者 (起案者) がその修正を受け入れたという承認の記録だけ — 人間のレビューなら著者が suggestion を accept する瞬間に相当するものが、現行パイプラインには存在しない (本文生成が自動反映し、CV が「受け入れの形跡なし」として修正ごと捨てている)。
§1.2 現状 (As-Is)
本番 telemetry (審査の実行記録データベース) の実測 (2026-06-02〜06-12、bodyOnlyMitigation フィールドを持つ 62 run。run = 審査 1 回の実行):
- CV verdict (盲点×評価軸ごとの判定レコード) 2,385 件中 364 件 (15%) が body-only 割引を受け、うち 134 件は補強策を数えてもらえなかった結果 undermines=true (この盲点は決定の前提を毀損している、という判定) に変わった。割引された補強策は 364 件全件が socratic 盲点への対応 (52/52 run で telemetry の盲点記録 blind_spot_findings と一対一対応を確認)。純粋な捏造 (盲点と無関係な加筆) の検出は 0 件。
- CV 却下 33 run 中 6 run (18%) は、却下の決め手が「割引された socratic 由来の補強策」のみで、純粋な却下要因がゼロ (機械再計算)。
- 実害例: docs-build 差分ビルド起案は 4 連続 CV 却下 (約 2.2 時間)。起案者はドラフトを 2,721→12,051 字へ毎回増補して再投入したが、却下盲点が毎ラウンド総入れ替わり (一致 0/1)、最後は同一入力なのに合格と差し戻しに割れた (審査の非決定性)。浪費ラウンドは ADR-0109 の bounded rounds (差し戻し回数の上限) の残り回数も消費する。
- さらに CV プロンプト内部で規則が衝突している: LIFECYCLE-AWARE BAR (実装前の ADR に適用する審査基準ルール) は「実装時検証型の前提は本文にリスクへの具体的な対策機構があれば対処済み」と要求し、BODY-ONLY CHECK が「生テキスト非由来の本文補強策は割り引け」と指示する。socratic 由来の機械補強は構造的に全件この板挟みになる。
§1.3 課題
- CV 却下の 18% (観測窓 6/33 run) が、socratic 由来の機械補強を割引した結果のみで発火し、1 ラウンド以上を浪費している。
- 起案者には差し戻し理由 (本文加筆ではなく承認の不在) が明示されず、増補→再投入を繰り返す (docs-build 例で 4 ラウンド・2.2 時間)。
- bodyOnlyMitigation 観測フラグはあるが、socratic 対応と純粋捏造を区別せず一律割引している。
§1.4 制約・要件
- #reliable: golden eval で FN (見逃し) =0 を維持する。盲点非対応の純粋な本文加筆への割引ガードは残す。
- #usable: 起案者が同因で 1 ラウンド浪費しない (差し戻し理由の明確化または事前消化)。
- 承認の所在: ADR-0109「最終判断は人間 PR レビュー」と整合し、承認行為が PR 終端 1 箇所に集約される。
- 役割整合 (ADR-0141): 構成要素 (CV プロンプト・PR 補強一覧・正典 §G・operator_guide) はすべて platform 所有で完結する。
- 撤退可逆性: prompts/production と worker の通常 PR で OFF にできる。
§1.5 目標 (To-Be)
socratic 由来の本文補強策は CV の正当な判定根拠として認め、引き換えに PR 本文の「Pipeline 補強一覧」で人間の終端レビュアーに明示承認させる。Non-Goals: 却下式 (critical×Must×undermines−降格) の変更、bodyOnlyMitigation フィールド自体の廃止 (観測継続)、生テキスト/本文の構造統合 (ADR-0097 の論点)。
決定
CV プロンプトの BODY-ONLY MITIGATION CHECK を「Gate 1 盲点に対応する本文の補強策は正当な根拠として扱い、盲点と無関係な本文加筆のみ従来どおり割り引く」に改める。bodyOnlyMitigation フィールドは観測フラグとして残す。同時に、PR 作成時に bodyOnlyMitigation=true だった補強策を「Pipeline 補強一覧 (Gate 1 盲点対応・起案者の生テキスト外)」として PR 本文へ自動列挙し、各項目に対応する PR template チェックボックス + CI ブロック (チェックボックス未完了で merge 不可) を設置して、終端レビューで人間が項目単位で明示承認する設計とする。補強策の妥当性判定 (CONCRETE MITIGATION MECHANISM 水準) と却下式は変更しない。
粒度と承認者 (RQ-097 セルフチェック・ADR-0141): CV ルール変更と PR 補強一覧は「正当と認める ⇔ PR で明示承認させる」という交換条件で結合した単一決定であり、独立して撤退できない (撤退条件は両方を一体で案 C へ戻す)。本決定の構成要素はいずれも platform 所有で approver.role = platform の 1 役割に収まる。本決定が各 ADR の承認者に「Pipeline 補強一覧の確認」義務を課す点は platform 横断則 (ADR-0138 と同型) であり、個別 ADR の補強の採用責任がその ADR 自身の approver に帰属することは本決定の仕組みそのものである。
検査の所有 (正典 adr_structure_pyramid_principle.md §G・5 層モデル) との整合: 本決定は「補強策が妥当か (頑健性)」と「機械補強を決定として採用するか (承認)」を分離し、前者を従来どおり ③ 審査 (CV) の所有に残し、後者を ④ 受理 (人間の PR 終端) の所有へ移す。bodyOnlyMitigation は差し戻し権限を持たない情報提供型検査となり、④ の判断材料 (Pipeline 補強一覧) に回る (§G-3「同じ観点で差し戻せる層は 1 つ」「決定を採用する最終権限は ④ の人間だけ」)。実装 PR には正典 §G-1 表更新と operator_guide §4.4 レビューチェックリストへの追記を含める。
判断基準 (Decision Drivers)
3.1 評価軸
| # | 軸 | 重要度 (係数) | 案件特有の解釈 |
|---|---|---|---|
| 1 | #usable | [Must] (×2.0) | 起案者が「何を直せば通るか」不明なまま同因で 1 ラウンド浪費しない。承認行為が PR 終端 1 箇所に集約され迷いがない |
| 2 | #reliable | [Must] (×2.0) | 手抜き ADR の検出力を落とさない (golden eval FN=0 維持)。盲点非対応の加筆への割引ガードは維持 |
| 3 | #efficient | [Medium] (×0.5) | 再 run の LLM 費・起案者時間・bounded rounds 残り回数の浪費を削減 |
K.O. criterion: Must 軸 (#usable / #reliable) のいずれかで score < 3 の案は不採用。golden eval FN=0 を満たせない実装は採用しない。
3.2 評価軸 × 案スコア表
| 軸 | 係数 | 採択案 (PR 終端承認) | 案 B (織り込み停止) | 案 C (差し戻し精緻化) | 案 F (条件付き 2 パス) |
|---|---|---|---|---|---|
| #usable | ×2.0 | 4 | 2 | 3 | 4 |
| #reliable | ×2.0 | 4 | 2 | 4 | 4 |
| #efficient | ×0.5 | 4 | 3 | 3 | 2 |
| 加重和 (正規化) | 0.800 | 0.420 | 0.700 | 0.760 | |
| K.O. 通過 (Must ≥3) | ✓ | ❌ | ✓ | ✓ |
案 F は加重和で本案に肉薄するが、承認実効性で本案と同等水準を達成するには Workers 実行時間 (常時 2 回 LLM コール、条件付きでも 15% の run に追加レイテンシ) と承認 UX (run 内モーダル相当の起案者割込み) のトレードオフが残る (詳細は §4)。
検討した代替案 (Alternatives Considered)
- 案 B: body_generation の盲点織り込みを停止し未解決のまま人間へ差し戻す — 最終文書から盲点対応が消え品質低下。盲点注入は設計意図 (Risks 言及指示) であり後退になる。#reliable で K.O. 不通過。不採用。
- 案 C: 差し戻しメッセージの精緻化のみ (割引された補強策を列挙し、ドラフトへの取り込みを指示) — 現行メッセージは既に盲点一覧+「対策を追記して再投入」を提示しており、実測でも起案者は増補再投入している (2/3 件は 1 ラウンドで脱出済み)。増分が小さく、却下 1 回ぶんの浪費 (LLM 費+時間+rounds 予算) は構造的に残る。不採用。ただし撤退時の戻り先として採用する。
- 案 D: socratic 対応分のみ割引免除する限定ルール — 観測窓では割引 364 件全件が socratic 対応であり本案と実質同一。判定条件を複雑にする意味がないため本案に統合。
- 案 E: 現状維持 — 同因のみ起因の却下が CV 却下の 18%、4 連続却下マラソン実測、プロンプト内規則衝突が放置される。不採用。
- 案 F: body_generation の 2 パス化 (条件付き含む) — 1 パス目で本文と補強候補を生成し、起案者が補強を承認してから 2 パス目で確定する。bodyOnlyMitigation=true の run (観測窓で 364/2,385 verdict ≈ 15%) のみ 2 パス目を走らせる条件付き設計なら常時コスト増は避けられる。承認実効性は run 内で得られ、本案の最大の負 (起案者未確認のまま受理) を解消できる利点がある。一方で (a) Workers 実行時間制約 (条件付きでも該当 run のレイテンシ +1 LLM 往復、起案者待機が必要)、(b) 起案者が確認を返すまで run が宙づりになる非同期 UX の追加実装、(c) bodyOnlyMitigation は CV verdict 後に判明するため「2 パス目に戻す」制御フローが既存の Gate 順序に逆行する、(d) 補強の妥当性は CV が判定済みで、欠けているのは「採用承認の記録」だけなので、承認を PR 終端へ集約する本案で十分達成できる、の 4 点で本案を選好。条件付き 2 パスは案 C への撤退後に再評価する選択肢として保持。
影響 (Consequences)
§5.1 正の影響 (Good)
- CV 却下 run の 18% (観測窓 6/33) が初回通過に変わり、再 run 費と起案者時間を削減。
- ADR-0109 bounded rounds 予算の浪費要因が 1 つ消える。
- プロンプト内の規則衝突 (LIFECYCLE-AWARE BAR × BODY-ONLY CHECK) が解消。
- 検査の所有 (§G-3) が「妥当性=③/採用=④」に分離され、同観点 2 層差し戻しが解消。
§5.2 負の影響 (Bad)
- 決定の重みを支える補強策 (critical×Must の前提を守る機構) が、起案者の再投入承認を経ずに本文確定する。承認は PR レビュー 1 箇所に集約されるため、レビューで「Pipeline 補強一覧」を見落とすと、起案者が一度も目にしていない補強が受け入れの記録なしに受理される (盲点 #1 への構造的対策として PR template チェックボックス + CI ブロックを採用)。
- ADR-0116 の ad-hoc 批准は起案者の能動的な明記行為だったが、本決定はそれを自動生成に置き換える。レビュアーが無意識に Approve を流すコストが構造的に上がる (チェックボックス強制で緩和)。
- 悪意ある起案者が socratic に意図的な盲点を誘発し、都合のよい補強を「正当」として本文に織り込む経路が理論上開く (盲点 #2)。socratic の盲点生成は起案者入力に加えて外部知識ベースを参照するため完全独立ではないが、誘発の検出は ④ PR レビュー (補強一覧の項目妥当性確認) と telemetry 異常検知 (Confirmation ②) で行う。
§5.3 中立・トレードオフ (Neutral / Trade-offs)
- bodyOnlyMitigation フィールドは観測フラグとして維持。割引動作は止めるが、socratic 連動性の集計には継続使用。
- golden eval の既存 A/B 2 ケース (body-only-fabricate→undermines=true / raw-grounded→false) は、新ルールでは「Gate 1 盲点との連動の有無」で期待値を再設計する (§Confirmation で実装前確定事項として明示)。
- 観測窓を bodyOnlyMitigation 付き run に絞ったため、フィールド付与前のフルデータでの純粋捏造発生率は実装着手前に再集計する (盲点 #2 への対処)。
撤退条件 (Rollback Plan)
- 判定指標 1: 導入後の新規 PR 10 本中 4 本以上 (40%) で「Pipeline 補強一覧」記載の補強策が PR レビューで削除または大幅書き直しになる。
- 40% の根拠: 現状 CV 却下 18% (機械補強の自動受理を拒否している割合) を「許容できる品質劣化の上限」の参照点とし、CV 却下 18% よりも高い損失率になった時点で「機械補強を正当扱いする利得 < 人手書き直しコスト」と判定する。CV 却下は run 単位、本指標は PR 単位 (1 PR ≒ 1 採択 ADR) で粒度が異なるため、同値ではなく 2 倍強の余裕 (40%) を撤退閾値に設定。10 本のサンプル数は統計的有意性ではなく 検知速度 (10 PR 蓄積で約 2〜3 週間と見込み、撤退判断のラウンドトリップを ADR-0109 の bounded rounds 周期に揃える) を優先した運用閾値。
- 「大幅書き直し」の定義: (a) 補強項目の文字数変化率 50% 超、(b) 項目の見出し/対象軸が変わる (= 別の盲点への対応に書き換わる)、のいずれかを満たす場合。
- 判定指標 2: golden eval FN=0 が原版 baseline 比較 multi-run (変更前プロンプト 3 回 vs 変更後プロンプト 3 回) で達成できない → merge しない (実装中止)。
- 期限: 導入後 4 週間 or PR 10 本のいずれか早い方で初回評価。
- 撤退操作: CV プロンプトの当該ルールを旧文言へ戻す PR + PR 補強一覧生成の OFF (いずれも prompts/production と worker の通常 PR で可逆)。
- 代替案: 案 C (差し戻しメッセージ精緻化) へ戻す。条件付き 2 パス (案 F) は撤退後の次候補として再評価。
コスト試算
- 実装 約 1.0〜1.5 人日:
- CV プロンプト改修 + golden eval 再設計 + multi-run 検証 (LLM 従量 数百円/run × 3 回程度) 約 0.5〜1.0 人日
- PR「Pipeline 補強一覧」生成 + PR template チェックボックス + CI ブロック + webhook unit test 約 0.5 人日
- 正典 §G-1 表 + operator_guide §4.4 チェックリスト追記 約 0.1 人日
- 効果 (観測窓 10 日間の実測ベース): 同因のみ却下 6 run ぶんの再 run LLM 費 (数百円/run) と起案者対応時間 (docs-build 1 件で実測 約 2.2 時間) を削減。
Confirmation
- 検証手段:
- crossval golden eval FN=0 (既存 CI ゲート・PR 毎)。
- telemetry 月次集計クエリで bodyOnlyMitigation × undermines × critical × Must の件数を監視 (期待値: socratic 対応分 0 件/月)。同時に「盲点非対応の本文加筆 (純粋捏造候補)」の月次件数を新規メトリクスとして追加し、月 1 件以上検出を異常閾値とする。
- PR 補強一覧の同梱を webhook unit test で検証 (CI 毎)。検査対象に PR template チェックボックスの完了状態 を含め、未完了で merge ブロックすることを GitHub branch protection rule で強制。
- 実装前確定事項 (盲点 #4 対処・merge 前に PR 内で確定):
- golden eval の新ケース定義: (a) 「socratic 盲点に対応する本文補強」→ undermines=false、(b) 「socratic 盲点と無関係な本文加筆」→ undermines=true、の 2 ケースを最小セットとし、旧 A/B ケースの捏造検出パターン (盲点リストとの照合なし加筆) は新ルールでもカバレッジを維持することを差分テストで確認。
- bodyOnlyMitigation フィールド付与前の過去 run (全 run) に対する盲点非対応の body-only 加筆の発生率を再集計し、純粋捏造の発生実績が観測窓外でも 0 件相当であることを定量確認 (盲点 #2 対処)。
- 実行頻度: ①③ CI 毎、② 月次。
- 違反時対応: ② で同因件数が月 2 件以上に再増したらルール退行を疑い調査。同一 draft の同因 2 連続却下を検知したら escalate (人間判断への引き上げ・ADR-0109 経路)。純粋捏造候補が月 1 件以上検出された場合は CV ルールを一時的に旧版へロールバックし、誘発経路を分析。
参照 (References)
- 関連 ADR (型付き辺 ADR-0131):
- follows_up_on: ADR-0109 (CV 過剰審査ループの bounded rounds + 人間 PR レビュー終端 — 0109 §5.2 #3 で残置された翻訳層リスクの宿題を引き受け、「承認を PR 終端へ一本化」原則に従い bounded rounds 浪費要因を除去)
- depends_on: ADR-0071 (socratic の盲点検出エンジン再定義 — 盲点注入が無ければ正当化すべき機械補強そのものが存在しない)
- relates_to: ADR-0097 (起案者生テキストの構造整合・未採択 — 翻訳層の非対称を構造統合ではなく承認の層移動で部分解消) / ADR-0116 (chunking 再設計 — body-only 割引された CAS ロック補強策の ad-hoc 批准の先例を制度化) / ADR-0119 (code-grounded review の evidence 経路 — Phase C 実装中。実証型 vs 採用承認型で対象直交、0119 §1 の実害 3 件記録と定量根拠が整合) / ADR-0141 (承認者検査の ④ 受理層所有 — 同方向、機械補強の採用承認も ④ へ置く) / ADR-0143 (CV critical×Must 2 段化 + early socratic — 第 1 段すり抜け残余を本決定が扱う)
- supersedes / amends / conflicts_with: なし (BODY-ONLY 割引ルールはコミット由来であり、変更対象となる受理済み ADR が存在しない)
- 関連 PR/Issue: -
- 外部資料: 正典
adr_structure_pyramid_principle.md§G-1, §G-3 /operator_guide.md§4.4
Known Limitations / Escalated Residual Risks (HITL ratification required)
本 ADR は Cross-Validation で goalpost ループ検知 (2 連続却下・却下盲点が毎回移動) のため、自動審査を打ち切り「残余リスク付き Accept」として起票された (ADR-0109 Part4)。以下の未解決 critical 盲点は、人間レビュー (この PR の merge = 受理 / close = 却下) で最終判断すること。LLM critic による反復審査では収束しないと判定されたものであり、PR レビューが外部検証器となる。
未解決 critical 盲点:
- PR補強一覧のチェックボックスを埋めなくてもApproveできる運用では、機械補強が無審査で本文確定する