コンテンツにスキップ

ADR-0052: 配る仕組みではなく、配布物そのものを検査する

採用(2026-08-14)

ADR-0048で、判定基準を第4章の表から機械抽出し、機械可読の複製へ書き戻す仕組みを作りました。その直後に、配布物から判定基準が消えていました。

準拠テンプレートへ配る知識ベースの生成器(build-template-kb.mjs)は、ゲートの情報として識別子・判定者・出所の URL だけを出力していました。判定基準の中身を出していません。

一方、テンプレート側の知識ベースには判定基準が42件入っていました。生成器を一時的に改変して生成し、生成器だけを元へ戻したためです。

結果として、再生成すれば消える配布物が残りました。実際、npm run template:kb を1回実行しただけで42件が消えました。

複製の検査は、知識ベースと src/data/ の YAML の一致を見ます。生成器が出力しない項目は、両側に存在しないため「一致」と判定されます。

「配る仕組みがあること」と「配っていること」は別です。仕組みの存在を検査しても、配布物の中身は保証されません。

同じ形の見落としが4回続いている

Section titled “同じ形の見落としが4回続いている”
# 事象 作った対処
#216 規定が実行層へ降りていない 実装マークで経路を作った
#227 様式が降りていない 必須欄の双方向検査を作った
#238 判定基準が降りていない 本文からの生成と検査を作った
本件 配る仕組みはあるが、配っていない —

いずれも「経路を作る」ことで解決してきました。経路が実際に動いているかは見ていませんでした。

正本と複製の一致だけでなく、配布物の中身が正本と一致することを検査します。

判定基準については、配布した知識ベースが運ぶ判定基準の総数が、第4章の表の総数と一致することを検査します。一致しない場合、生成器が出力していない可能性を指摘します。

2. 配布物へ、生成元の版を記録する

Section titled “2. 配布物へ、生成元の版を記録する”

配布物に生成元のコミットを書きます。

受け取り側が「自分の複製が正本のどの時点のものか」を知る手段は、これしかありません。

3. 限界の申告を、運用ではなくデータへ置く

Section titled “3. 限界の申告を、運用ではなくデータへ置く”

ADR-0048 決定3 は「表の外にある規範は降りない。降りていないことを明示する」と定めました。この明示を、受け取り側の運用に委ねません。

配布物のデータ構造そのものへ、降りていないことを示す欄を持たせます。値が変わっていないことを検査します。

運用は忘れられます。データは検査できます。

4. 上流の生成器を直す必要が生じた場合、上流へ提起する

Section titled “4. 上流の生成器を直す必要が生じた場合、上流へ提起する”

下流が上流の生成器を改変して配布物を作り、生成器を元へ戻す形を採りません。再生成で消える配布物が残ります。

正しい順序は、上流へ提起する → 正本と生成器を直す → 配るです。

案 却下の理由
生成器の出力項目の一覧を、別に管理して検査する 一覧そのものが第3の正本になる。配布物を直接見れば足りる
配布物を手で編集することを許し、検査から外す 再生成で消える。消えたことが検出されない状態が残る
生成の日時や作業ツリーの状態を配布物へ記録する 生成のたびに変わり、本文を編集しただけで複製の検査が落ちる。版の識別にはコミットで足りる
何もしない 本件と同じ事故が、次の配布項目で再発する
  • npm run check が、配布物の判定基準の件数と生成元の版を検査する
  • 配布物の限界の申告(criteriaComplete)が消えた場合、検査が落ちる
  • 配布物に含まれない項目は、依然として検査できない。検査するのは、配ると決めた項目が実際に配られているかだけである
  • 配布項目を増やすたびに、対応する検査を足す必要がある