← AIバイブコーディングTips 一覧へ Prompt Versioning / Reproducibility

AIへの指示書を"リリース"として扱う

AIに動画のナレーション・図解・キャラクター演技を作らせる指示書(SKILL.md)を、ソフトウェアのリリースと同じ規律で管理している。4つのスキルで計58バージョンをまるごとスナップショット保存し、版ごとにdiffとSHA-256を記録する仕組みと、それを入れた日に下した1つの判断の話。

この記事で手に入るもの

バージョンごとにフォルダごとスナップショットを残すだけで始められる最小実装と、複数ファイルをまとめて1つのハッシュへ固定する具体的な計算方式。そして、検証できない過去を検証できないと正直にラベル付けした判断の中身。

01 — 何が起きたか

指示書を直すたびに、過去の動画が"別物"になる

AIに動画を作らせるとき、キャラクターの表情の出し方・図解の描き分け・ナレーションの尺配分といった細かいルールをSKILL.mdという指示書にまとめて運用している。だが指示書は完成品ではなく、AIが変な破綻を起こすたびに書き換わっていく。ある日、「先月完成させたあの動画は、今の指示書のどのバージョンで作られたものか」を誰も答えられないことに気づいた。

4つのスキル(犯罪統計ラボ向けの長尺用・Short用、SURPLUS向けの長尺用・Remotion用)を横断すると、この仕組みを入れた時点で振り返り対象になった制作は計17件。指示書側は何十回も書き換わっているのに、成果物側には「その時どの版を使ったか」の記録が一切残っていなかった。


02 — 核心

ソフトウェアのリリースと同じ型を輸入する

対処は難しい理屈ではなく、ソフトウェア工学がとっくにやっている型をそのまま持ち込むことだった。4スキル合計で58バージョン(犯罪統計ラボの長尺用22版・Short用9版、SURPLUSの長尺用13版・Remotion用14版)を管理する仕組みは、次の3つでできている。

01

版ごとに丸ごとスナップショット

skill-history/<version>/というフォルダへ、その版の指示書一式をまるごとコピーして保存する。差分だけでなくその時点の完全な状態を残すので、過去のどの版へでもその場で切り戻せる。

02

版間のunified diff

1.0.0-to-1.1.0.patchのような形式で、何をどう変えたかを差分として残す。スナップショットだけでは「今回どこを直したか」が埋もれてしまうため、変更点そのものを読める形にしておく。

03

SHA-256を2種類記録

SKILL.md単体のハッシュと、参照ファイルまで含めたスキル一式(bundle)のハッシュを別々に取る。「指示書の中身」と「付属ドキュメントまで含めた全体」を、それぞれ独立して固定する。

この3つを揃えると、「この動画は、どの版の指示書で作られたか」を後から機械的に証明できるようになる。曖昧な記憶やファイルのタイムスタンプに頼らなくて済む。


03 — 実装の中身

bundleハッシュは「連結してから1回ハッシュ」

SKILL.md単体のSHA-256は、ファイル1つを普通にハッシュ化すればいい。だがスキルには参照用のMarkdownファイルが複数付属することがあり、それら一式を「1つのハッシュ」にまとめる必要がある。実際に固定している方式はこうだ。

# bundle hashの計算方式(skill_production_registry.md より)
スキル内の全ファイルを相対パス順に並べる
各ファイルについて relative_path + NUL + file_sha256 + LF を連結する
連結した文字列全体のSHA-256を取る

ファイルを1つずつハッシュ化して単純に結合するのではなく、相対パス + NUL区切り + そのファイルのSHA-256 + 改行という決まった形式で連結してから、最後に全体をもう一度ハッシュ化する。ファイル名の並び順まで方式として固定しているので、誰が・どの環境で計算しても同じbundleハッシュに落ち着く。曖昧さを残さないための、地味だが効く設計だ。


04 — 過去を偽らない判断

検証できない過去は、検証できないと書く

この仕組みを導入した日、既存の制作をどう扱うかという判断が必要になった。「今日から全部を検証済みとみなす」と決めてしまうこともできた。しかしそれは実質的に嘘になる——ハッシュを記録していなかった制作の"当時の版"を、後から正確に証明する手段はないからだ。

過去を「最初から検証済みだった」ことにしなかった、という一文の判断が、この仕組み全体の信頼性を支えている。都合よく遡及して"全部OK"にしてしまえば、ラベル自体の意味がなくなる。


05 — 版の中身

バージョンは番号ではなく、破綻の記録

実際の版の中身を見ると、抽象的な「改善」ではなく、AIが実際に起こした具体的な破綻への対処が1バージョンずつ積み上がっている。

1.1

正確な数値はナレーションでなく図表に残す

意味表情・まばたき・口形も独立管理に変更し、同一表情は原則2beatまでというルールを追加した。数字の読み違いと、表情の使い回しによる不自然さを同時に潰す版。

1.2

顔パーツの部分合成を禁止

目・まぶた・口などをパーツ単位で差し替える合成方式をやめ、完成済みの上半身画像を丸ごと交換する方式へ変更。パーツ単位の合成が引き起こす不自然な破綻を、丸ごと差し替えという単純な制約で封じた。

3.0

チャットUIの捏造を禁止

メッセージアプリの再現シーンでは、実在デザインを監査済みのモックアップHTMLを正本とし、配色・アイコン・吹き出しの状態だけを移植して題材固有の文面だけを差し替えるルールに変更。AIが実在サービスをそれらしく捏造してしまう問題への対処。

バージョンごとにフォルダごと保存するだけでも十分効果があるdiffやハッシュは後から足せる。まず「版ごとに丸ごと残す」を最小実装として始められる。
「入力」と「出力」の両方をハッシュで縛る成果物側のハッシュだけでは「何で作ったか」が分からない。指示書側のハッシュだけでは「何ができたか」の裏付けがない。両方を記録して初めて、後から突き合わせられる。
検証できない過去は、検証できないと正直にラベル付けする仕組みを後から入れたときほど、遡及して"全部OK"にしたくなる。そこを我慢することが、ラベルそのものの信用を守る。