ADR 審査を安定させる 3 つの軸(粒度・グラフ衛生・判定のブレ対策)
これは何か: ADR の自動審査(DRP の cross-validation)を直すために調べた 3 つの研究を、つながりが分かるように 1 枚にまとめた解説。 元ネタ: RQ-097(粒度)/ RQ-100(ADR 依存グラフ・グラフ衛生)/ ADR-0109・RQ-098(判定のブレ対策)。 位置づけ: なぜこの 3 つが「別々の対策」なのかを理解するための背景説明(Explanation)。手順や規約そのものは各 ADR・各 lint ルールが正。
0. 何のための 3 つなのか(出発点)
すべては 「審査しすぎ問題(過剰審査)」 を直すための話。
審査役の AI(cross-validation の critic)が、いま決めようとしていることの範囲の外まで口を出してくる。 「正本をどこに置くか」だけ決めたいのに、「では障害時の復旧は? 索引の整合は?」と、本来は別の決定が担当すべき心配ごとまで突きつけて差し戻す。
たとえ:確定申告の窓口に「売上の計上方法」だけ相談に行ったのに、窓口の人が「社会保険は? 登記は? 採用計画は?」と全部詰めてきて、肝心の相談が前に進まない。
この 1 つの病気を、効く場所が違う 3 つの治療で同時に治す。 同じ薬を 3 回出すのではない。**3 つは別の軸(角度)**だ ── これが「別軸」の意味。
1. 3 つの軸の地図(先に結論)
| 軸 | 何をそろえるか | 放っておくと | 元ネタ |
|---|---|---|---|
| A. 粒度 | 審査に入れる「かたまり」の大きさ | 論点が多すぎて審査役が迷子になる | RQ-097 |
| B. グラフ衛生 | 決定どうしのつながりの正しさ | 「それは別の決定の担当」と言えても、その別の決定を指し示せない | RQ-100 |
| C. 判定のブレ対策 | 審査役の答えのブレと安全性 | 同じ入力でも、やるたびに結論が変わる | ADR-0109 / RQ-098 |
大事なのは 3 つが互いに独立していること。1 つ直しても、残り 2 つは別途いる。
2. 軸 A:粒度 ── かたまりを正しい大きさに切る(RQ-097)
やること:1 つの ADR には 1 つの決定だけ。 3 つの調査モデル(OpenAI / Gemini / Claude)が、別々に調べて同じ結論にたどり着いた(=確からしさが高い)。
「1 つの決定」かどうかは、4 つのサインで見分ける(どれか 1 つでも分かれたら 2 本に割る):
- 元に戻せるか(やり直しのコスト)が違う
- 判断の決め手が違う(← 後述)
- 承認する人・関係する人が違う
- やめる条件・うまくいったか測る物差しが違う
たとえ:お弁当箱の仕切り。 ご飯・おかず・デザートを 1 つの仕切りに全部入れると、味が混ざって何を食べているか分からなくなる。 審査役も同じで、論点が混ざると真ん中の論点を見落としやすくなる(調査では、正しく拾える率が 85〜95% → 76〜82% に落ちると報告)。 仕切りを分ければ、1 品ずつちゃんと味見できる。
なぜ AI 審査に効くか:論点が多い ADR は「ゴールポスト動かし」(← 後述)を起こしやすい。 だから論点が大きすぎるときの最初の手当ては「要約」ではなく「分割」。
実運用:この粒度チェックは起案テンプレ
_meta/templates/adr-draft.template.mdの「採用したい方針」に Y-Statement(「Xで Yに直面し、AでなくZを選び、Bのため、Cを受け入れる」)として実装。1 文に圧縮 → "かつ" が入るor収まらない → 発散シグナルで分割判断、という流れで書きながらチェックする。③シグナルの注意:承認者で割るときは「決める役割(decider)」で見る。「実行する役割(executor)」が違うだけでは割らない(過剰分割になる)。今 1 人でも decider 役が分かれるなら割る。
3. 軸 B:グラフ衛生 ── 決定どうしの「つながり」をきれいに保つ(RQ-100)
軸 A は「1 個の大きさ」の話。軸 B は「個と個のつながり」の話。まったく別物。
なぜいるか:軸 C の審査役が「その心配ごとは、この決定の担当ではない。別の決定が持つべきだ」と賢く判断できたとする。 でも、その「別の決定」を確実に指し示せなければ、口出しを取り下げられない。「どこかにあるはず」では監査に通らない。
いまのつながりは“汚れている”:
- 片側だけ:A が「B を置き換えた」と書いても、B 側は何も言っていない
- 行き先が消えている(dangling):もう廃止された ADR を指したまま
- 文章の中に埋もれている:本文の散らかった文章にだけ書いてあって、機械が追えない
ここでこのプロジェクトにぴったりのたとえ:複式簿記。 借方に書いたら、必ず貸方に同じ額の相手がいる。片側だけの記帳は帳簿が合わない=エラー。 グラフ衛生のチェック(双方向の整合)はまさにこれ。 「A が B を置き換えた」なら「B 側にも『A に置き換えられた』が必ず立つ」。片側しかなければエラーで止める。 いわば 決定の世界の複式簿記。
直し方(3 モデル合意):
- つながりの正本(SSoT)を、本文の文章ではなく **frontmatter(ファイル先頭の構造データ)**に置く
- つながりの種類(型付き辺)を 7 種だけに絞る
- チェック(lint)で強制:行き先が実在する/両側がそろっている/置き換えと状態が食い違わない/ぐるぐる循環しない
- 機械が使う一覧(
_graph.json)は自動で吐き出す(手で書かない)
「衛生」の本当の意味 = 軽くし続けること: 現場の知見では、重い依存グラフは誰も手で保守しない=やがて形だけになる。 だから「最小限のチェック + 自動生成」を死守する。
たとえ:台所の掃除。毎日サッと拭く仕組み(自動化)なら清潔が続く。月 1 の大掃除(手作業の重い棚卸し)に頼ると、結局やらなくなって汚れがたまる。
4. 軸 C:判定のブレ対策 ── 「気分屋の審査役」を御す
軸 A は大きさ、軸 B はつながり。軸 C は審査役の答えそのものがブレる問題。さらに別物。
問題:AI は同じ入力でも、やるたびに違う答えを出す。今の合否ゲートは 1 回だけだと 約 6% が間違って不合格になる(元のプロンプトでもブレる)。
たとえ:気分屋の審査員。同じ料理を出しても、今日は 85 点、明日は 78 点。1 回の採点を信じると事故る。
手当ては重ねて使う:
多数決(何回か回して多い方を採る)
体重計に 5 回乗って平均を取る。あるいは、複数の医者にセカンドオピニオンを聞く。
後ろに「ブレない厳格なルール」を置き、迷ったら安全側に倒す
気分屋の審査員の後ろに、機械的なルール係を置く。「少しでも怪しければ、全部“差し戻し側(捨てない)”にする」。 見落とし(拾うべきものを取りこぼすこと)をゼロにするための、わざと片側に傾けた設計。「迷ったら捨てない」。
やり直し回数に上限を付ける(ADR-0109)
「2 回連続で新しい重大な指摘が出なければ打ち切り」「3〜4 回で終了」。← 次のゴールポスト動かしへの蓋。
採点表を固定する(閉じた採点表)(← 後述)
「問題を自由に探せ」ではなく、決まったチェック項目を渡す。
5. 3 つはどうかみ合うか(ここが核心)
別の軸=独立だが、互いを強め合うのが面白いところ。
- A が C を助ける:かたまりを小さくする(A)と、何回回しても同じ結論に収束しやすい。入力を整えるとブレ(C)が減る。
- B と C で「賢い取り下げ」が成り立つ:審査役が「これは範囲外」と判断(その判断の安全性は C が担保)→「ではどの決定の担当か」をつながりの一覧で確認(B)→ 本当にその決定が持つべきものだと分かって初めて、口出しを取り下げる。
- つながりが汚れていれば確認に失敗する → C の「迷ったら捨てない」で安全側に倒れる。つまり B が未整備でも事故は起きないが、取り下げの効き目(審査しすぎの解消)が出ない。
- だから B は C の前提。
だから着手の順番が決まる:
(先) 軸 B グラフ衛生 ── 低リスク(文書・ツールだけ)・前提になる
↓
(後) 範囲を意識する審査役の本実装 ── 本番審査に影響する(FN-critical)ので慎重に
グラフ衛生を先にやる理由は 2 つ。審査役がそれに頼ること。そして、グラフ衛生は壊しても本番審査を壊さない低リスクだから。
全体のたとえ:図書館のリニューアル。
- 軸 A = 1 冊 1 テーマに本を整理し直す(蔵書の粒度)
- 軸 B = 相互参照カードを複式簿記式に整える(蔵書のつながり = 先にやる土台)
- 軸 C = 司書(審査役)の判断を、チェックリスト + 複数人確認 +「迷ったら貸さない」で安定させる 3 つは別作業だが、全部そろって初めて「正確で、ブレず、関連書もちゃんと辿れる図書館」になる。
6. よく出る言葉の意味(プレーン版)
判断の決め手(ドライバー)が同じか?
その決定を**「最後に何で決めたか」の理由**のこと(業界用語で Decision Drivers)。
たとえば「保守しやすさ」「事業の継続性」「コスト」など。
2 つのサブ決定で、決め手にしている理由が違うなら、別々の決定として割る。
理由が違うと、重視するものが違い、評価のしかたも変わるから。
(参考: arc42 Q42 の品質タグ。詳しくは adr_decision_drivers_guide.md)
ゴールポスト動かし(ゴールポスト現象)とは?
審査を繰り返すうちに、審査役が合格ラインをジリジリ上げていくこと。 「ここ直して」→直す→「じゃあここも」→直す→…と終わらなくなる。 論点が多い ADR ほど起きやすく、繰り返すほど効き目が落ちていく(学術的にも報告あり: in-context reward hacking)。 対策が「やり直し回数の上限」と「採点表の固定」。
閉じた採点表(閉じたルーブリック)とは?
チェック項目があらかじめ決まっている採点表のこと。 「問題があれば何でも自由に書いて」だと、審査役が毎回ちがう観点を思いつき、答えがブレる。 決まったチェックリストにすると、毎回同じ土俵で採点でき、上の「ゴールポスト動かし」も起きにくい。
7. 出典についての正直な注記(どこまでが根拠か)
質問された 2 点を正直に切り分ける。
「型付き辺を 7 種だけ」は論文どおりか? → 完全な既製品ではない。3 モデル調査の合意(OpenAI 6 種・Gemini 7 種・Claude 8 種)と、既存ツール(
adr-toolsの双方向リンク、EventCatalog、MADR)を土台にしつつ、当社の文章語彙(complements / inherits-from / parallel)に合わせて 7 種に整えた当社版。土台は外部にあるが、数の「7」は当社の取捨選択。詳細はdocs/research/rq-100-adr-dependency-graph-synthesis.md。「最小の型 + 自動生成 + lint 強制」は論文どおりか? → 2 つの根拠の合わせ技。① RQ-100 の 3 モデル合意(frontmatter を正本にし、機械向け一覧は自動生成、クロスファイルのチェックだけ自前で約 200 行)。② 日本企業 5 社の技術ブログの現場知見(重い依存グラフは誰も保守せず形だけになる/ツール導入が目的化して失敗)。 → 学術論文より、現場の運用失敗談が「軽くしろ」の主な根拠。出典は
adr_operational_lessons_ja.md。単一企業の体験談なので、当社の特殊事情(AI 自動パイプライン・ひとり・監査要件)に合わせて部分的に取り入れるもの。
8. 関連ドキュメント
docs/research/rq-097-adr-decision-granularity-synthesis.md— 軸 A(粒度)の調査本体docs/research/rq-100-adr-dependency-graph-synthesis.md— 軸 B(グラフ衛生)の調査本体docs/research/rq-098-scope-aware-critique-synthesis.md— 範囲を意識する審査役の設計(軸 C と B のつなぎ)_internal/05_how-to/adr_operational_lessons_ja.md— 現場知見(「軽くし続けろ」の根拠)_internal/05_how-to/adr_decision_drivers_guide.md— 判断の決め手(ドライバー)の書き方- ADR-0109 — 審査しすぎループの根本対策(やり直し回数の上限)
- ADR-0107(Proposed)— ADR 索引 + 依存グラフ整備(グラフ衛生はこの具体化)