設定ドリフト照合器が「毎朝ずっと赤」になるのを止める(照合対象外の値の扱いとguardの当て方)
決定台帳と本番設定を毎日照合する仕組みは、APIに現れない値をパス欄に説明文で書いた瞬間に永久MISSINGへ落ち、本物のドリフトが埋もれる。照合対象外を第3状態(null=DOC)に分ける設計、値を巻き込まず書式だけ直す手順、旧データでfailさせてから当てるguardの検定順を示す。
約1.2万トークンの節約 (API料金換算で約18円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「設定ドリフト照合器が「毎朝ずっと赤」になるのを止める(照合対象外の値の扱いとguardの当て方)」は、開発プロセスカテゴリのAI指示書(MDファイル)です。決定台帳と本番設定を毎日照合する仕組みは、APIに現れない値をパス欄に説明文で書いた瞬間に永久MISSINGへ落ち、本物のドリフトが埋もれる。照合対象外を第3状態(null=DOC)に分ける設計、値を巻き込まず書式だけ直す手順、旧データでfailさせてから当てるguardの検定順を示す。この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約1.2万トークン(API料金換算で約18円)・84%のトークンを節約できます。
- カテゴリ
- 開発プロセス
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約1.4万トークン
- この巻物使用時
- 約2,200トークン
- 節約量
- 約1.2万トークン (約18円)
- 更新日
- 2026-09-21
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/guard/raw を読み込んで、この指示書どおりに実装して"
中身
設定ドリフト照合器が「毎朝ずっと赤」になるのを止める(照合対象外の値の扱いと guard の当て方)
これは何の指示書か
本番設定(価格パラメータ・機能フラグ・しきい値など)の「決定台帳」を JSON で持ち、 毎日のバッチで実設定と機械照合して差分(ドリフト)を検出する仕組みを運用している人向け。
この仕組みは必ず一度は「常に赤」に落ちる。落ち方の型と、二度と起きないようにする guard の当て方を書く。 AI エージェントに読ませればそのまま設計・修正できる粒度にしてある。
起きること(実例・2026-09)
台帳のエントリはこういう形をしている。
{
"parameters": {
"upperPrice": {
"configPath": "pricing.upperPrice",
"current": 14100,
"status": "decided",
"rationale": "…なぜこの値にしたか…",
"history": [ { "at": "…", "value": 16000, "note": "…なぜ覆したか…" } ]
}
}
}
照合器は configPath を本番設定 API の戻り値に対して split('.') で辿り、
値が一致すれば OK、辿れなければ MISSING、違えば DRIFT を出す。MISSING か DRIFT が1件でもあれば exit 1。
半年運用したあと、本番 API には現れない場所に住む値を台帳へ載せる日が来る。
コード内の定数、管理画面にしかない項目、表計算シートの列などだ。
その時、担当者(または AI)は親切心で configPath に所在の説明文を書く。
"configPath": "PriceCalculator の FLOOR 定数(コード内・API には出ない)"
照合器はこれを設定パスとして split('.') するので、永遠に MISSING を返す。
以後、毎日のバッチは必ず exit 1 で終わり、レポートの冒頭と通知が毎朝
「🚨 前提が崩れています」で始まるようになる。
なぜ致命的か
- 本物のドリフトが埋もれる。 毎朝赤いので、誰も赤を見なくなる。 照合器は「値が勝手に変わったこと」を捕まえるために作ったのに、その用を成さなくなる。
- 原因の表示が嘘に見える。 出るのは「台帳と実設定が一致しない」。 実際には設定は正しく、壊れているのは台帳の書き方だけ。読んだ人は本番設定を疑って時間を溶かす。
- 見つかるのが遅れる。 常駐ジョブが固定の版(ミラーやコンテナイメージ)で走っていると、 台帳の更新が反映されず何日も隠れる。版を揃えた瞬間に初めて出る。
直し方(設計)
照合器に「照合対象外」の第3の状態を持たせ、台帳の書式でそれを表現できるようにする。
configPath: null→ DOC(記録専用。機械照合しない。緑扱い)configPath: "a.b.c"→ 設定 API を辿って OK / DRIFT / MISSING- 所在の説明は別キー(
location)に書く。configPathには自由文を一切入れない
多くの実装は既に「null なら飛ばす」を持っている。持っているのに使われないのは、
書式の契約が台帳ファイル自身に書かれていないからなので、台帳の先頭 rules 配列にも1行入れる。
"configPath には設定 API のドット区切りパスだけを書く。API に現れない値は configPath を null にし、
所在は location に書く。説明文を configPath に入れると照合器が MISSING を返し毎朝 exit 1 になる"
直し方(guard・ここが本題)
契約を文章で書いても次の人は破る。機械で止める。
// 設定 API の戻りを辿れる形だけ許す
const DOTTED_PATH = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$/;
test('configPath は null か設定 API のドット区切りパスだけ(説明文を書かない)', () => {
const bad = Object.entries(ledger.parameters)
.filter(([, e]) => e.configPath !== null && !DOTTED_PATH.test(String(e.configPath)))
.map(([k, e]) => `${k}: ${JSON.stringify(e.configPath)}`);
assert.deepEqual(bad, []);
});
test('configPath が null の項目は所在を location か sheetCell に持つ', () => {
const bad = Object.entries(ledger.parameters)
.filter(([, e]) => e.configPath === null)
.filter(([, e]) => !e.location?.trim() && !e.sheetCell?.trim())
.map(([k]) => k);
// 既存の未記入分は許容し、新しく増えないことだけを守る
const KNOWN = ['legacyEntryName'];
assert.deepEqual(bad.filter(k => !KNOWN.includes(k)), []);
});
guard は必ず「落ちる側」で先に検定する。 読み込む台帳のパスを環境変数で差し替えられるようにしておき、
const LEDGER_PATH = process.env.LEDGER_PATH || path.join(HERE, '..', 'config', 'decisions.json');
- 修正前の台帳に当てて fail すること(何件・どの項目を検出したかまで見る)
- 修正後の台帳で pass すること
の順で確かめる。この順を守らないと、「常に通る空の検査」を追加して満足する事故が起きる。
assert.deepEqual(bad, []) は対象が0件でも通るので、通ったことは検知できることの証拠にならない。
直すときにやってはいけないこと
- 値を一緒に直さない。 これは書式の修正であって、判断の変更ではない。
current/history/ 根拠文は1文字も変えず、機械比較で差分ゼロを確認してからコミットする。
// 修正前後の台帳を突き合わせて「値は動いていない」を証明する
for (const k of Object.keys(next.parameters)) {
const a = next.parameters[k], b = prev.parameters[k];
if (JSON.stringify(a.current) !== JSON.stringify(b.current)) diff.push(k);
if (JSON.stringify(a.history) !== JSON.stringify(b.history)) diff.push(k + ' history');
}
- 照合器の側を緩めない。 「MISSING を警告どまりにする」で赤は消えるが、本物のドリフトも消える。 直すのはデータの書式であって検出器の感度ではない。
検収(この順で確かめる)
- 修正した台帳で照合器を実走 → exit 0 / MISSING 0 / DRIFT 0
- guard を旧台帳に当てて fail → 新台帳で pass
- テスト全体が緑
- 常駐ジョブが実際に読む場所(ミラー・コンテナ・デプロイ先)を新しい版に揃えてから、そこで照合器を実走 → exit 0 手元のリポジトリで通っても、常駐ジョブが古い版を読んでいれば翌朝また赤くなる
横に効く教訓
- 「毎朝赤い」は壊れているのではなく検出器が死んでいる。赤を見なくなった時点で仕組みが無効になっている
- 自由文と機械が辿る値を同じキーに同居させない。同居させた瞬間、片方が必ず壊れる
- 常駐ジョブが固定版を読む構成では、台帳の不良は版を揃えた日に初めて出る。 「今まで出ていなかった」は「無かった」ではない
よくある質問
+「設定ドリフト照合器が「毎朝ずっと赤」になるのを止める(照合対象外の値の扱いとguardの当て方)」とは何ですか?
決定台帳と本番設定を毎日照合する仕組みは、APIに現れない値をパス欄に説明文で書いた瞬間に永久MISSINGへ落ち、本物のドリフトが埋もれる。照合対象外を第3状態(null=DOC)に分ける設計、値を巻き込まず書式だけ直す手順、旧データでfailさせてから当てるguardの検定順を示す。
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約1.4万トークンかかりますが、この巻物を使えば約2,200トークンで済みます。差し引き約1.2万トークン(API料金換算で約18円)・84%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
スマホ(Remote Control)から即相談できる Claude Code タブを VS Code に毎朝自動で用意する
自作VS Code拡張で公式Claude Codeのコマンド(editor.openLast/newConversation/renameSessionTab)を叩き、名前付きタブをN本自動補充。夜間はWM_CLOSE→再起動で毎朝揃える。--bg/ターミナル経路・タブ0でのnewConversation・SendKeys再読み込みが失敗する実測付き
夜間ジョブ異常を通知で終わらせず自動修復→AI修理PR→人へ引き渡す閉ループ
監視の『検知して通知』の後段に、決定的Playbook→AIコーダーの隔離worktree修理PR→持ち越し→人への3要素引き渡し、を足す実装指示書。argvで指示を渡すな等の実測の落とし穴つき
ドキュメント駆動開発プロセス CLAUDE.md — 作るものを固めてから書かせる
「AIが暴走して意図と違うものを作る」を根絶する開発プロセス指示書。UI仕様→機能設計→実装の順をAIに強制し、1ファイルごとに承認ゲートを挟む。受託開発・チーム開発向け。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア