型付き辺: 出 9 / 入 2
ADR-0088: ADR 起案にコスト試算を必須化する (churn 最大ドライバ対策)
- Status: Accepted
- Mode: Standard
- Kruchten Type: Executive/Property
- Scope: platform
- Implementation Status: Not Started
- 起案者: [email protected]
- 起案日時 (JST): 2026-05-29 21:24
- 承認日時 (JST): 2026-05-29 21:43 (Pipeline 通常 flow Standard 41/50 通過 + Cross-Validation INFO、PR #1143 マージ)
- Deciders: [email protected] (単独)
コンテキスト
§1.1 背景
ADR 起案の再投入 churn が高止まりしている (14 ADR に 32 run = 2.3 倍、却下率 52%)。review-tiering の spike で前提が崩れた際の telemetry 再分析 (2026-05-29) において、churn の最大ドライバが「コスト試算の欠落」であることが手動コーディングで判明したのが本 ADR の発端である。
§1.2 現状 (As-Is)
- 却下 19 run のうち「起案品質不足」起因が 8 件。この 8 件すべてが却下理由に「コスト試算欠落」を含む(最大の単一ドライバ)。
- 残り 11 件は Cross-Validation 毀損 (盲点 × Must) で、その大半は一点ものの正当リスク (盲点 269 件中 92% がユニーク dedupeGroup)。審査を浅くしても減らず、減らすべきでもない。
- 構造的事実: パイプラインはコスト試算を Gate4 (採点)で初めて検査する。それ以前 (Gate0 triage / Gate1 盲点検出 / Gate3 並列レビュー)に内容完全性の関門が無く、コスト欠落の起案でも重い審査をフルに通してから Gate4 で初めて落ちる。
- 起案テンプレ (operator_guide §4.1) にコスト試算は必須項目として存在しない。
- 却下理由コーディングは現時点で手動である。
§1.3 課題
コスト欠落の起案でも、Gate1 盲点検出 + Gate3 3 モデルレビュー + Gate4 採点 (~6.7 分 + Opus コスト)をフルに通してから初めて却下される。この無駄なパイプライン 1 周を源流で防げていない。
§1.4 制約・要件
- 起案者負担は最小化する (粗い数値 1 つで可、30〜60 秒/起案)。
- Light 経路は免除可。Standard 以上のみ適用。
- 既存の差戻しフロー (needsAdr=false 系) を再利用。
- adr-lint は既存パターン (
decision-drivers-mcda) を踏襲。 - 追加 LLM コストはゼロ。GAS 実行時間の増分なし。
§1.5 目標 (To-Be)
Standard 以上の ADR 起案では、コスト試算 (数値 1 つ以上)が起案段階で必須となり、欠落起案は Gate1 以前で差し戻される。Non-Goals: コスト試算の「正確さ」検査、Light 経路の審査軽量化、KV 結果整合性の起案チェック (別 follow-up)。
決定
コスト試算を起案必須にする。単一の決定を 3 層で強制する: (1) 起案前ゲート (Gate1 より前で Standard 以上のコスト欠落を差し戻す、churn 削減の本体)、(2) operator_guide §4.1 起案テンプレへの必須項目追加、(3) scripts/adr-lint.mjs への cost-estimation-section ルール追加 (merged 品質の CI backstop)。設計原則は「粗くてよい・数値 1 つでよい」を徹底し、完璧な試算でなく「数値で考えた痕跡」を必須化する。実装順序は (0) telemetry 自動書込 (cost-missing コード) → ③adr-lint → ②テンプレ → ①起案前ゲート とする。telemetry 自動書込を先行させるのは、撤退判定の観測ループが手動コーディングに依存すると破綻するため (盲点 #8 / Policy Alignment 指摘)。各段で telemetry 観測する。
判断基準 (Decision Drivers)
3.1 評価軸
| # | 軸 | 重要度 (係数) | 案件特有の解釈 |
|---|---|---|---|
| 1 | #efficient | [Must] (×2.0) | churn 削減効果。コスト欠落起案を源流で弾き、無駄な Gate1〜Gate4 通過 (~6.7 分 + Opus) を削減できるか |
| 2 | #maintainable | [High] (×1.0) | pipeline 改修の保守負担、adr-lint ルールの単純性、撤退容易性 |
| 3 | #reliable | [High] (×1.0) | 誤判定 (正当起案の誤ブロック、形式充足のすり抜け)の少なさ、観測ループが破綻しないこと |
| 4 | #usable | [Medium] (×0.5) | 起案者負担、差戻しメッセージの分かりやすさ、新規・外部コントリビューターへの摩擦 |
| 5 | #operable | [Medium] (×0.5) | telemetry での効果測定可能性、撤退条件の判定が機能すること |
K.O. criterion: Must 軸 #efficient の score < 3 は不採用。
3.2 評価軸 × 案スコア表
| 軸 | 係数 | 採択案 (3 層) | 案 A (テンプレのみ先行) | 案 B (adr-lint のみ) |
|---|---|---|---|---|
#efficient | ×2.0 | 4 | 2 | 1 |
#maintainable | ×1.0 | 3 | 5 | 5 |
#reliable | ×1.0 | 3 | 4 | 4 |
#usable | ×0.5 | 3 | 4 | 5 |
#operable | ×0.5 | 3 | 3 | 2 |
| 加重和 (正規化) | 0.680 | 0.620 | 0.540 | |
| K.O. 通過 (Must ≥3) | ✓ | ❌ | ❌ |
加重和は K.O. 通過候補のタイブレーク用 (Suhr 1999 CBA 準拠)。案 A/B は Must 軸 #efficient が K.O. ライン未満のため不採用候補。ただし盲点 #3 の指摘 (テンプレ単体先行検証) を踏まえ、実装順序を ③→②→①の段階化とし、各段で効果を分離測定する (盲点 #13 対応で 2 週間のベースライン観測期間を挿入)。
検討した代替案 (Alternatives Considered)
- 案 A: §4.1 起案テンプレ必須化のみ (工数 0.25 人日): 最小コスト・最小リスク。書き漏れ予防効果はあるが、書き漏らした起案は依然として Gate4 まで通ってから却下される (churn 削減効果が弱い)。Must 軸
#efficientを K.O. 通過しない。盲点 #3 の指摘どおり段階化①として先行実装し、2 週間の観測でベースラインを更新してから残り 2 層の必要性を再判断する。 - 案 B: adr-lint backstop のみ: パイプライン後にしか効かず、churn 削減には寄与しない (merged 品質保証のみ)。Must 軸 K.O. 不通過。
- 案 C: 現状維持 (Gate4 で落とし続ける): churn 52% を放置。却下 8/8 のコスト欠落由来を改善できないため棄却。
- 案 D: Gate4 採点ルーブリックを厳格化: 採点段階の改善であり源流対策にならない。むしろ churn を増やす方向。
影響 (Consequences)
§5.1 正の影響 (Good)
- churn 最大ドライバ (コスト欠落 8/8) を起案前に源流カット。無駄な審査 1 周 (~6.7 分 + Opus)を削減。
- 起案テンプレに項目があることで書き漏れ自体が減る (予防効果)。
- adr-lint backstop で merged ADR のコスト記述が保証され、横断的な品質が向上。
- 役割分担が明確: churn 削減は起案前ゲート、merged 品質は adr-lint。
§5.2 負の影響 (Bad)
- 起案前ゲートが pipeline コードに分岐を 1 つ増やす (保守対象増)。
- 「数値 1 つあれば通る」ため、内容の薄いコスト試算をすり抜けさせるリスク (数値の質は Gate1/Gate4 に委ねる割り切り)。盲点 #6 のとおり、'コスト試算: 1人日' 等の形式的 1 行で通過し得る。
- 正規表現判定の false negative (コスト記述があるのにキーワード不一致で誤って弾く)リスク。
- 起案前ゲートと Gate4 cost_estimate 採点ルーブリックの判定基準乖離により、「ゲート通過後 Gate4 で低評価却下」という新たな churn パターンが発生し得る (盲点 #7)。
- 緊急・時間制約のある起案 (インシデント・規制対応)で 30〜60 秒の追加負担がプロセス不信感を生み、非公式チャネル迂回を招くリスク (盲点 #10)。
- 新規・外部コントリビューターへのオンボーディング摩擦増大 (盲点 #4)。
- ゲート通過後の起案のみが計測対象に残り、サバイバーバイアスにより「品質向上」と誤解されるリスク (盲点 #12)。
§5.3 中立・トレードオフ (Neutral / Trade-offs)
- コスト試算は「粗くてよい・数値 1 つでよい」を徹底し、内容妥当性は Gate1/Gate4 に委ねる割り切り。
- サンプルサイズ 8 件からの単一ドライバ断定の脆弱性 (盲点 #1): 本プロジェクトは個人開発 (起案者は代表取締役 1 名) のため起案者属性 (新規/既存・チーム) の分散は無く、「特定起案者への集中」起因ではない。「テンプレ周知のみでの試行」との比較は段階化②(テンプレ先行) がそれに相当し、②単独効果を 2 週観測してから①③の必要性を判断する設計で代替する。チーム拡大時 (Jr 入社) には起案者属性別の再分析を行う。
- 「欠落」と「不十分」の内訳 (盲点 #5): 8 件は手動コーディング上「却下理由にコスト試算を含む」で括っており、コスト試算セクション自体が無い「欠落」と数値はあるが粗すぎる「不十分」の厳密分離は未実施。本 ADR の存在チェックは「欠落」に直接効き、「不十分」は Gate4 §8 に委ねる割り切り。両者の比率は telemetry 自動コーディング (実装順序 0) 導入後に計測する。
- Gate4 cost_estimate 採点基準と起案前ゲート通過条件 (数値 1 つ) の乖離 (盲点 #7): 通過条件は Gate4 §8 合格を保証しない。両者の対応表を実装時に作成し、起案前ゲートの差戻しメッセージに Gate4 観点 (工数人日 + 運用コストの両軸) を例示して乖離を縮める。
- /draft 等の自動生成起案では「数値 1 つあれば通る」が形骸化リスクとなる (盲点 #4)。生成プロンプトへのコスト試算指示組み込みは follow-up。
- Light/Standard 判定境界の曖昧性 (盲点 #9): 境界ケースは Standard として扱うフェイルセーフを採用。判定基準の明文化は実装前タスクとする。
- 将来の監査・コンプライアンス要件で「粗い数値 1 つ」が不十分と判定された場合: adr-lint ルールをセマンティックバージョニングし、基準引き上げ時は既存 ADR を遡及修正せず新規起案から適用する (ADR-0031 immutable パターン準拠)。既存 ADR は corrigendum 注記で対応。
コスト試算 (Cost Estimate)
採択案 (3 層 + telemetry 先行) の実装工数を作業単位で内訳する (個人開発: 代表取締役 + Claude Code 補助)。
| 作業 | 工数 (人日) | 改修対象ファイル |
|---|---|---|
| (0) telemetry 自動書込 (cost-missing コード) | 0.5 | drp/src/audit/types.ts / src/audit/persistence.ts |
| (0') 観測ダッシュボード (事前定義クエリ) | 0.25 | src/index.ts (/audit/runs 拡張) + クエリ集 |
③ adr-lint cost-estimation-section ルール | 0.5 | scripts/adr-lint.mjs (既存 decision-drivers-mcda パターン) + ルールドキュメント |
| ② §4.1 起案テンプレ必須化 | 0.25 | docs/_internal/05_how-to/operator_guide_langgraph.md |
| ① 起案前ゲート + テスト | 0.5〜1.0 | src/nodes/triage.ts (or src/index.ts の /draft) + テスト |
| 合計 | 約 2.0〜2.5 人日 |
- 追加 LLM コスト: ゼロ。むしろ削減方向 — コスト欠落起案を Gate1 前に弾けば、その起案にかかる Gate1 盲点検出 (DA+PM+Judge) + Gate3 3 モデルレビュー + Gate4 採点 (~6.7 分 + Opus) が丸ごと節約される。spike の 8 件分が該当 (≈ 8 × 6.7 分 + Opus 8 起案分)。
- GAS 実行時間: 増分なし。本パイプラインは Cloudflare Workers 上で動作し GAS ではない (ADR-0019)。Workers の CPU time 制限に対し、起案前ゲートは正規表現 1 回のため影響は無視できる (数 ms オーダー)。
- 起案者負担: コスト欄に粗い数値 1 つ (30〜60 秒/起案)。
撤退条件 (Rollback Plan)
判定: 4 週ごとのレビュー (担当: 起案者)、初回判定は 8 週時点。
観測指標 (盲点 #2, #8, #12 を踏まえ再設計):
- Total churn rate = 却下 run / (全 run + ゲートブロック件数)。分母を固定し、ゲートブロックを除外したサバイバーバイアスを防ぐ。
- ゲートブロック件数のうち起案者異議申し立て件数/比率 (誤ブロック率の代理指標)。
- 「ゲート通過後 Gate4 cost_estimate 低スコア却下」件数 (盲点 #7 の新 churn パターン専用カウンタ)。
- 「形式充足・Gate4 却下」件数 (盲点 #6 の形骸化早期検出指標)。
- 却下理由コーディングの自動化: Gate1 前差し戻し時に却下理由コード ('cost-missing' 等)を
telemetry_recordsに自動書き込みする仕組みを起案前ゲート実装と同時に組み込む (盲点 #8)。
撤退トリガ:
- 8 週時点で total churn rate が低下しない → 起案前ゲートの判定ロジックを見直し、または撤回。
- 異議申し立て率 > 20% (4 週中間レビュー閾値) → ゲートを警告のみ (ソフト)に切替、または adr-lint backstop のみに縮退。
- 「ゲート通過後 Gate4 却下」件数が導入前の Gate4 コスト欠落却下件数を上回る → 通過条件と Gate4 採点基準の対応付けドキュメントを作成し、必要なら基準を統一。
- telemetry 自動書き込みが実装されない場合は本 ADR を撤回 (観測不能のため判定不能)。
段階的撤退 (盲点 #13 対応):
- (0) telemetry 自動書込 → ③adr-lint 実装 → 2 週間観測 (ベースライン更新) → ②テンプレ実装 → 2 週間観測 (テンプレ単独効果のベースライン更新、pre-registration)→ ①起案前ゲート実装。各段で却下率変化を独立測定。telemetry 先行により全段階で観測ループが機能する。
Confirmation
- 検証手段:
- adr-lint ルール
cost-estimation-section(CI で全 ADR をチェック、merged 品質保証)。 - 起案前ゲートの自動 telemetry 書き込み ('cost-missing' コード)。
- 4 週ごとの観測指標ダッシュボード (事前定義クエリ、手動コーディング依存ゼロ)。
- adr-lint ルール
- 実行頻度: adr-lint は全 PR の CI で実行。telemetry 集計は 4 週ごとレビュー。
- 違反時対応: adr-lint 違反は CI failure で merge ブロック。観測指標が撤退トリガに該当した場合は本 ADR 起案者がレビューし、ソフト化または撤回を判定。
参照 (References)
- 関連 ADR:
- ADR-0024 (ADR テンプレートの構造化) — 正規構造に「コスト試算」を必須セクションとして位置づける運用を追加 (lint/テンプレでの存在チェックに留める)。
- section-alignment ADR (draft id
align) / review-tiering ADR (差し戻し済) — 別軸。review-tiering の spike で「コスト欠落が churn 最大ドライバ」と判明したのが本 ADR の発端。
- 関連 PR/Issue: -
- 外部資料:
- operator_guide §4.1 起案テンプレ
scripts/adr-lint.mjs(既存decision-drivers-mcdaパターン)- Gate4 scoring rubric §8 cost_estimate
- D1
telemetry_records却下 run 手動コーディング結果 (2026-05-29)
- follow-up 候補: KV 結果整合性の起案チェック + read-once キャッシュ (KV 読込コスト ~30% 減の副次効果)、/draft 自動生成プロンプトへのコスト試算指示組み込み、adr-lint ルールバージョニング方針。
11. 参照: Pipeline 審査履歴 (2026-05-29 実行時, 通常 flow)
本セクションは Decision Pipeline (LangGraph TS on Cloudflare Workers) で本 ADR 草案を通常 flow (retroactive=false) で審査した結果のログ。Gate4 41/50 (Standard 閾値 40 + 1pt 余裕) 通過 + Cross-Validation INFO (Must 毀損なし)。本 ADR 系列で初めて Gate4 と Cross-Validation の両方を一度に通過した適用例。デフォルトでは折りたたまれており、
▶をクリックで展開する。
📋 Pipeline 審査履歴 全 Gate 結果 (合格 Score 41 / 50) — クリックで展開
Gate 0-4 結果
- Gate 0 Triage: needsAdr=true / triageMode=Standard
- Gate 1 Socratic: 盲点 13 件検出 (情報提供型、§5 / §撤退条件 に反映)
- Gate 2 Consistency: INFO (既存 ADR と矛盾なし、ADR-0036/0038/0053/0077 の延長線上)
- Gate 3 Parallel Review: 3 vendor (Gemini / Claude / o3) 出力は §5・撤退条件・コスト試算へ反映
- Cross-Validation (盲点 × Must): INFO (Must 軸毀損なし)
- Gate 4 Scoring: 41 / 50 (scoringMean 41, stdDev 0)
| # | 採点項目 | 点数 | コメント |
|---|---|---|---|
| 1 | 問題定義 | 5 | 却下 8/8 のコスト欠落を spike で定量化 |
| 2 | 代替案 | 5 | テンプレのみ / adr-lint のみ / 現状維持 / Gate4 厳格化 の 4 案 + K.O. |
| 3 | 判断基準 | 5 | Q42 5 軸 + 係数 + K.O. + 正規化加重和 |
| 4 | 過去 ADR 整合性 | 3 | ADR-0036/0038/0053/0077 の参照明記で改善余地 (本 PR で §参照 補強) |
| 5 | 影響範囲 | 3 | pipeline 改修ファイル名が不明瞭だった (本 PR で §コスト試算 表に改修対象ファイルを明記) |
| 6 | 運用上の罠 | 5 | 13 盲点を §5.2/5.3 に反映 |
| 7 | ロールバック性 | 5 | 観測指標 5 種 + 撤退トリガ 4 種 + 段階的撤退 |
| 8 | コスト試算 | 2 | 採択案の作業別工数内訳が欠落 (本 PR で ## コスト試算 節新設、作業別 ~2.0-2.5 人日に内訳化) |
| 9 | 完了条件 | 4 | Confirmation 3 要素 |
| 10 | 長期影響 | 4 | 段階導入 + 4 週レビュー + follow-up |
合計: 41 / 50 (Standard 閾値 40 → PASS, Cross-Validation INFO)
Status 遷移
- 本 PR で Status: Proposed → Accepted に更新。採点時の改善余地を同時反映:
Scope: platform追加 (ADR-0049 / adr-lint scope-meta 解消)## コスト試算節新設 (§8 2/5 対応: 作業別工数 + 改修ファイル名 + LLM 削減/Workers 制約)- §5.3 の
(要追記)3 点充足 (サンプル属性 / 欠落 vs 不十分 / 将来の基準上方修正) - 実装順序を (0) telemetry 自動書込 先行に変更 (循環論法 rollback の観測ループ確保)