ADR-0052: 配る仕組みではなく、配布物そのものを検査する
採用(2026-08-14)
コンテキスト
Section titled “コンテキスト”ADR-0048で、判定基準を第4章の表から機械抽出し、機械可読の複製へ書き戻す仕組みを作りました。その直後に、配布物から判定基準が消えていました。
何が起きたか
Section titled “何が起きたか”準拠テンプレートへ配る知識ベースの生成器(build-template-kb.mjs)は、ゲートの情報として識別子・判定者・出所の URL だけを出力していました。判定基準の中身を出していません。
一方、テンプレート側の知識ベースには判定基準が42件入っていました。生成器を一時的に改変して生成し、生成器だけを元へ戻したためです。
結果として、再生成すれば消える配布物が残りました。実際、npm run template:kb を1回実行しただけで42件が消えました。
なぜ検出できなかったか
Section titled “なぜ検出できなかったか”複製の検査は、知識ベースと src/data/ の YAML の一致を見ます。生成器が出力しない項目は、両側に存在しないため「一致」と判定されます。
「配る仕組みがあること」と「配っていること」は別です。仕組みの存在を検査しても、配布物の中身は保証されません。
同じ形の見落としが4回続いている
Section titled “同じ形の見落としが4回続いている”| # | 事象 | 作った対処 |
|---|---|---|
| #216 | 規定が実行層へ降りていない | 実装マークで経路を作った |
| #227 | 様式が降りていない | 必須欄の双方向検査を作った |
| #238 | 判定基準が降りていない | 本文からの生成と検査を作った |
| 本件 | 配る仕組みはあるが、配っていない | — |
いずれも「経路を作る」ことで解決してきました。経路が実際に動いているかは見ていませんでした。
1. 配布物そのものを検査する
Section titled “1. 配布物そのものを検査する”正本と複製の一致だけでなく、配布物の中身が正本と一致することを検査します。
判定基準については、配布した知識ベースが運ぶ判定基準の総数が、第4章の表の総数と一致することを検査します。一致しない場合、生成器が出力していない可能性を指摘します。
2. 配布物へ、生成元の版を記録する
Section titled “2. 配布物へ、生成元の版を記録する”配布物に生成元のコミットを書きます。
受け取り側が「自分の複製が正本のどの時点のものか」を知る手段は、これしかありません。
3. 限界の申告を、運用ではなくデータへ置く
Section titled “3. 限界の申告を、運用ではなくデータへ置く”ADR-0048 決定3 は「表の外にある規範は降りない。降りていないことを明示する」と定めました。この明示を、受け取り側の運用に委ねません。
配布物のデータ構造そのものへ、降りていないことを示す欄を持たせます。値が変わっていないことを検査します。
運用は忘れられます。データは検査できます。
4. 上流の生成器を直す必要が生じた場合、上流へ提起する
Section titled “4. 上流の生成器を直す必要が生じた場合、上流へ提起する”下流が上流の生成器を改変して配布物を作り、生成器を元へ戻す形を採りません。再生成で消える配布物が残ります。
正しい順序は、上流へ提起する → 正本と生成器を直す → 配るです。
検討した選択肢
Section titled “検討した選択肢”| 案 | 却下の理由 |
|---|---|
| 生成器の出力項目の一覧を、別に管理して検査する | 一覧そのものが第3の正本になる。配布物を直接見れば足りる |
| 配布物を手で編集することを許し、検査から外す | 再生成で消える。消えたことが検出されない状態が残る |
| 生成の日時や作業ツリーの状態を配布物へ記録する | 生成のたびに変わり、本文を編集しただけで複製の検査が落ちる。版の識別にはコミットで足りる |
| 何もしない | 本件と同じ事故が、次の配布項目で再発する |
npm run checkが、配布物の判定基準の件数と生成元の版を検査する- 配布物の限界の申告(
criteriaComplete)が消えた場合、検査が落ちる - 配布物に含まれない項目は、依然として検査できない。検査するのは、配ると決めた項目が実際に配られているかだけである
- 配布項目を増やすたびに、対応する検査を足す必要がある